大致内容
- 知识储备
Requests获取网页信息
XPATH 提取爬虫
Map 开启多线程- 爬取目标
回帖人姓名
回帖内容
回帖时间- 流程图
- 代码分析
- 成果展示
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"
成果展示
点击查看更多内容
16人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦