继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

爬取挪威的森林—直子所有的深爱都是秘密

BluyeaSun
关注TA
已关注
手记 24
粉丝 77
获赞 3400
大致内容
  1. 知识储备
    Requests获取网页信息
    XPATH 提取爬虫
    Map 开启多线程
  2. 爬取目标
    回帖人姓名
    回帖内容
    回帖时间
  3. 流程图
  4. 代码分析
  5. 成果展示

python 2.7.11


流程图

图片描述



代码分析

#-*-coding:utf8-*-
from lxml import etree
from multiprocessing.dummy import Pool

#由于所获取的信息有一部分包含在JSON对象中,所以要用到json对象方法反序列化
import  json

import requests
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

# 生成贴吧网页列表
def getPages(url,total):
        urls=[]
        for i in range(1,total+1):
            singlePage=url+str(i)
            urls.append(singlePage)
        return urls
# 获取每一页所有楼主
def getElements(url):
    html=requests.get(url)
    # 获取网页的文本,容易经常忘记html
      不仅仅是网页的源代码还包含了其他很多信息
    html = html.text

    selector=etree.HTML(html)
    elements=selector.xpath("//div[@class=
            'l_post l_post_bright j_l_post clearfix  ']")
    return elements

# 得到该页所有楼主的信息
def getInfo(elements):
    ElementsInfo=[]
    for each in elements:
        singlePeopleInfo={}
        # 注意尽管经过xpath的选择只有一个元素,
            依然要用列表的形式[0]获取该元素
        jsonPreInfo=each.xpath('@data-field')[0]

        jsonInfo=json.loads(jsonPreInfo)
        # 得到json对象获取内容是json['attrname']
            而不是类的class.attrname
        singlePeopleInfo['name']=jsonInfo['author']['user_name']
        # xpath可以通过chrome自动生成
        singlePeopleInfo['date']=each.xpath("div[2]/div[2]/div[1]/
                    div[2]/span[4]/text()")
        singlePeopleInfo['content']=each.xpath("div[2]/div[1]/
                    cc/div[1]/text()")[0].strip()

        ElementsInfo.append(singlePeopleInfo)
    return ElementsInfo

# 将楼主信息写入文件保存下来
def fileWrite(info):
    f=open('info.txt','a')
    for eachPage in info:
        for eachElement in eachPage:
            f.writelines("name:"+eachElement['name']+'\n')
            f.writelines("date:" + str(eachElement['date']) + '\n')
            f.writelines("content:" + eachElement['content'] + '\n')
            f.writelines('\n')
    f.close()

# 将流程逻辑组织在spider中便于多线程map函数的调用
def spider(url):
    print u'正在处理 %s'% url
    Elements=getElements(url)
    Elementsinfo=getInfo(Elements)
    # 声明全局变量因为要在多个函数之中共同使用
    global info
    info.append(Elementsinfo)

if __name__ == '__main__':
    # 开启多线程,数字取决电脑的核数,几核就是几
    pool=Pool(2)
    info=[]
    url="http://tieba.baidu.com/p/2985466337?pn="
    urls=getPages(url,5)
    pool.map(spider,urls)
    pool.close()
    pool.join()
    fileWrite(info)
    print "ok"

成果展示

图片描述

打开App,阅读手记
16人推荐
发表评论
随时随地看视频慕课网APP