栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

大致内容
  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"
成果展示

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/226096.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号