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

321 查看

大致内容
  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"

成果展示

图片描述