根据所学做小爬虫案例

根据所学开始实战

需求; 爬取糗事百科热门的所有段子,以及发帖人的年纪和性别,头像等等

技术栈: lxml 和 requests

步骤分析:

  • 获取url_list
  • 发送请求获取响应
  • 分析提取我们需要的数据
  • 保存数据 具体代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

import requests
from lxml import etree
import json
class QiushiSpider:

def __init__(self):
self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',}
self.url_temp = 'https://www.qiushibaike.com/8hr/page/{}/'

def get_url_list(self):
url_list = [ self.url_temp.format(i) for i in range(1,14)]
return url_list
def parse_url(self,url):
response = requests.get(url,headers=self.headers)
return response.content.decode()
def get_content_list(self,html_str):
html = etree.HTML(html_str)
div_list = html.xpath('//div[@id="content-left"]/div')
content_list = []
for div in div_list:
item = {}
item['content'] = div.xpath('.//div[@class="content"]/span/text()')
item['content'] = [ i.replace('\n','') for i in item['content']]
item['author_gender'] = div.xpath('.//div[contains(@class,"articleGender")]/@class')
item['author_gender'] = item['author_gender'][0].split(' ')[-1].replace('Icon','') if len(item['author_gender']) >0 else None
item['author_age'] = div.xpath('.//div[contains(@class,"articleGender")]/text()')
item['author_age'] = item['author_age'][0] if len(item['author_age']) >0 else None
item['content_img'] = div.xpath('.//div[@class="thumb"]/a/img/@src')
item['content_img'] = 'https:' + item['content_img'][0] if len(item['content_img']) > 0 else None
item['author_img'] = div.xpath('.//div[@class="author clearfix"]/a/img/@src')
item['author_img'] = 'https:' + item['author_img'][0] if len(item['author_img']) > 0 else None
content_list.append(item)
return content_list
def save_content_list(self,content_list):
for i in content_list:
with open('qiushi.txt','a',encoding='utf-8') as f:
f.write(json.dumps(i,ensure_ascii=False))
f.write('\n')
def run(self):
url_list = self.get_url_list()
for url in url_list:
html_str = self.parse_url(url)
content_list = self.get_content_list(html_str)
self.save_content_list(content_list)

if __name__ == '__main__':
qiushi = QiushiSpider()
qiushi.run()
print('完成噜!!!')

最后的部分结果:

{“content”: [“快六一了,去找经理请两天假陪孩子出去玩……由于紧张忘记敲门了,一推我就走进了经理的办公室,我擦,天气这么热吗??业务员小秋来给经理送咖啡穿的这么清凉,就在我还在愣神的时候,经理咳嗽了一下,我才从那个香艳身影中回过了头,慌忙从口袋掏出请假条递了过去,业务员小秋整了整衣服走了……经理接了过去说:你这只够请一天的啊?我紧张不知所措的搓着手说:一定要两天我都给老婆说好了的啊。经理说:可是你才给我50块啊!!!卧槽,50块…我递给经理的竟然是50块钱!!!我惨了,我该怎么办…经理笑着对我说:别着急,我不会…”, “查看全文”], “author_gender”: “man”, “author_age”: “31”, “content_img”: null, “author_img”: “https://pic.qiushibaike.com/system/avtnew/1856/18567753/thumb/20171204185604.JPEG?imageView2/1/w/90/h/90"}
{“content”: [“还记得央视做的调查吗?”, ““”大爷,你幸福吗?””, ““我不姓胡!””, “大爷,我们可是央视!这是要播出去全国人民看的,你重新组织一下语言。我们再来一次!”, ““”大爷,你幸福吗?””, ““我真的不姓胡,我姓杨,羊入虎口的杨!你虽然是央视但是你不能给我把姓都改了吧!””], “author_gender”: “man”, “author_age”: “35”, “content_img”: null, “author_img”: “https://pic.qiushibaike.com/system/avtnew/3356/33562722/thumb/20180327234023.JPEG?imageView2/1/w/90/h/90"}
{“content”: [“偶遇骗子打电话,说我是尊贵客户啥的,要给我发短信链接,领大金链子。。。”, “我去,这把我感动的。十几分钟后,我终于成功的把他气挂了。”, “后来想想人家只是骗子而已,何必气他呢,然后我带着歉意打了回去,嗯嗯对是我,你链接还没给我发呢。”], “author_gender”: “man”, “author_age”: “22”, “content_img”: null, “author_img”: “https://pic.qiushibaike.com/system/avtnew/3122/31220114/thumb/20170804192059.JPEG?imageView2/1/w/90/h/90"}
{“content”: [“评论都是人才 笑的肚子疼”], “author_gender”: “man”, “author_age”: “28”, “content_img”: “https://pic.qiushibaike.com/system/pictures/12052/120526000/medium/app120526000.jpeg", “author_img”: “https://pic.qiushibaike.com/system/avtnew/3750/37501721/thumb/20180415152346.JPEG?imageView2/1/w/90/h/90"}
{“content”: [“儿时的记忆,莫名的伤感。如今出来在外面,老家的房子都破败了!”], “author_gender”: null, “author_age”: null, “content_img”: “https://pic.qiushibaike.com/system/pictures/10101/101014950/medium/app101014950.jpg", “author_img”: null}
{“content”: [“小时候,大人出去了,我和表弟一起打扫卫生,拖地,累了就直接用水冲洗,然后我弟拿了水想泼我。”, “我也拿插了插座的吹风筒当枪对着他,一按开关,他把水泼过来,当时我大脑突然懵了,一阵麻,直接进入渡 劫状态,要不是刚好全村停电估计我当时就这么走了……”], “author_gender”: “man”, “author_age”: “33”, “content_img”: null, “author_img”: “https://pic.qiushibaike.com/system/avtnew/3349/33491754/thumb/20180520172640.JPEG?imageView2/1/w/90/h/90"}
{“content”: [“楼主眼睛有点小,有次面试,面试官非要我和他合影!”, “我不乐意了:我是来面试工作的!不拍照!面试官:如果你肯跟我合影,我就给你通过!”, “我纳闷的问为什么要和我合影?你可别喜欢我啊,我可有对象了!”, “面试官笑的眼泪都出来:妹子你想多了,我一直崇拜林永健,你眼睛特别像他,咱俩合影后,我随便一p,发朋友圈,也圆了我和明星合影的梦!”, “尼玛,,,”], “author_gender”: “women”, “author_age”: “14”, “content_img”: null, “author_img”: “https://pic.qiushibaike.com/system/avtnew/2470/24703920/thumb/201806041655481.JPEG?imageView2/1/w/90/h/90"}
{“content”: [“单身的角色就是善变”], “author_gender”: “man”, “author_age”: “0”, “content_img”: “https://pic.qiushibaike.com/system/pictures/12052/120525020/medium/app120525020.jpeg", “author_img”: “https://pic.qiushibaike.com/system/avtnew/3155/31551776/thumb/2018060713060891.JPEG?imageView2/1/w/90/h/90"}
{“content”: [“买大买小?”], “author_gender”: “man”, “author_age”: “32”, “content_img”: “https://pic.qiushibaike.com/system/pictures/12052/120524832/medium/app120524832.jpeg", “author_img”: “https://pic.qiushibaike.com/system/avtnew/3271/32711463/thumb/20170201161607.JPEG?imageView2/1/w/90/h/90"}
{“content”: [“在酒店做服务员,今天一个婚宴~~开始中,司仪让新郎和伴郎亲一个,中间放一个湿巾……估计两个人感觉反正也亲不到嘴,于是就打算亲~~关键是正亲的时候,司仪把湿巾给拉掉了,拉掉了,下面一群腐女都沸腾了好吗”], “author_gender”: “women”, “author_age”: “48”, “content_img”: null, “author_img”: “https://pic.qiushibaike.com/system/avtnew/2174/21747539/thumb/20141226190044.jpg?imageView2/1/w/90/h/90"}
{“content”: [“15年有一次地震,哪次地震我忘了,我当时初三,地震来了,全校的人都到操场集合,,当我跑到隔壁班的时候,隔壁班物理老师居然说,同学们别慌,我们讲完这道题再跑,后来全校点名批评,,”], “author_gender”: “man”, “author_age”: “22”, “content_img”: null, “author_img”: “https://pic.qiushibaike.com/system/avtnew/3726/37267710/thumb/2018060212353766.JPEG?imageView2/1/w/90/h/90"}
{“content”: [“去年我生日,嫂子和老妹每人给我买了一条漂亮的连衣裙。我很高兴,又请她们大餐又请k歌……”, “到家后,我试了试她们送我的连衣裙,都不太合身……然后,奇迹发生了,嫂子穿老妹买的裙子合适,老妹穿嫂子买的正好……”], “author_gender”: “women”, “author_age”: “84”, “content_img”: null, “author_img”: “https://pic.qiushibaike.com/system/avtnew/921/9214729/thumb/20180519111818.JPEG?imageView2/1/w/90/h/90"}
{“content”: [“先解释下,我们那年一本线是五百三分”], “author_gender”: “man”, “author_age”: “0”, “content_img”: “https://pic.qiushibaike.com/system/pictures/12052/120524216/medium/app120524216.jpeg", “author_img”: “https://pic.qiushibaike.com/system/avtnew/3765/37654758/thumb/2018041208170567.JPEG?imageView2/1/w/90/h/90"}
{“content”: [“女同事请假,说去看红眼病,回来销假时,门诊单是肛肠科的。”, “管考勤的是个死脑筋,说前后对不上,不给做病假处理,女同事急了眼:后眼不是眼啊?这时候旁边的另一位女同事眯着眼说:谁今天带了……嗯glasses,借用一下…”], “author_gender”: “women”, “author_age”: “101”, “content_img”: null, “author_img”: “https://pic.qiushibaike.com/system/avtnew/3137/31370749/thumb/20180525212235.JPEG?imageView2/1/w/90/h/90"}
{“content”: [“这是我的出生牌子”], “author_gender”: null, “author_age”: null, “content_img”: “https://pic.qiushibaike.com/system/pictures/10101/101018436/medium/app101018436.jpg", “author_img”: null}
{“content”: [“闺蜜怀孕了,说最近特别想吃火锅,让我陪她一起去吃。”, “我静静的看着她一个人吃了八盘肉。”, “然后一阵孕吐,她去厕所全吐了。”], “author_gender”: “women”, “author_age”: “25”, “content_img”: null, “author_img”: “https://pic.qiushibaike.com/system/avtnew/3354/33542137/thumb/20180415124145.JPEG?imageView2/1/w/90/h/90"}
{“content”: [“晚上不想吃饭去街边买煎饼,摊煎饼的是个帅气大哥。一面煎完,翻面的时候,大哥熟练的用小铲子一抄,稳稳的落在圆形铁板上,分毫不差。我佩服的说,大哥技术真好!大哥傲娇一笑,又翻了一下。只见煎饼回旋着飞了出去……大哥讪讪一笑说妹子不赶时间吧?我重给你摊一张……”], “author_gender”: “women”, “author_age”: “27”, “content_img”: null, “author_img”: “https://pic.qiushibaike.com/system/avtnew/1522/15227866/thumb/2018060110584566.JPEG?imageView2/1/w/90/h/90"}
{“content”: [“我是做广告的!7:30我正在吃饭,有人敲我们的门,特别用力,我说这是客户来了吗?赶紧去开门,开门是一个妇女,她问我,可不可以染发!”], “author_gender”: “man”, “author_age”: “29”, “content_img”: null, “author_img”: “https://pic.qiushibaike.com/system/avtnew/3127/31278272/thumb/20170401225846.JPEG?imageView2/1/w/90/h/90"}
{“content”: [“有个荷 兰 人第一次到香 港。他坐公车时,司机说请坐上面。过了一会儿,荷兰人走了下来,司机看到了对他说请坐上面好吗,下面已经满了。又过了一分钟,司机见荷兰人又走下来了,说不是让你坐上面吗? 荷 兰 人对司机说你不要骗 我了,上面根本就没有司机。”], “author_gender”: “man”, “author_age”: “97”, “content_img”: null, “author_img”: “https://pic.qiushibaike.com/system/avtnew/3392/33922427/thumb/20180126140038.JPEG?imageView2/1/w/90/h/90"}
{“content”: [“李刚儿子长这样~~”], “author_gender”: “women”, “author_age”: “53”, “content_img”: “https://pic.qiushibaike.com/system/pictures/10101/101017654/medium/app101017654.jpg", “author_img”: “https://pic.qiushibaike.com/system/avtnew/1645/16450783/thumb/20150519180404.jpg?imageView2/1/w/90/h/90"}
{“content”: [“呼噜呼噜,我和媳妇都有打呼噜的习惯——结婚一个月了,昨天午休,我先醒的,没错,是因为媳妇的呼噜声,望着媳妇美美的样子,感觉好幸福,突然还在睡梦中的媳妇一个耳光打在我脸上,然后神奇的事情发生了,媳妇的呼噜停了,继续沉睡。我由心里美美的变得呆呆的[笑哭][笑哭][笑哭][笑哭][笑哭][笑哭]”], “author_gender”: “man”, “author_age”: “29”, “content_img”: null, “author_img”: “https://pic.qiushibaike.com/system/avtnew/2120/21206391/thumb/20140930214242.jpg?imageView2/1/w/90/h/90"}

小结 爬虫的基本套路

  • 构造url
    • 准备start_url
      • url地址规律不明显,总数不确定
      • 通过代码提取下一页的url
        • xpath
        • 寻找url地址,部分地址在当前的响应中
    • 构造url_list
      • 页码总数明确
      • url地址规律明显
  • 发送请求,获取响应
    • 添加随机的user-agent, 反反爬虫
    • 添加随机代理ip
  • 提取数据

    • 确定数据的位置
      • 数据在当前的url地址中
        • 提取列表页数据
        • 提取详情页的数据
          • 确定url
          • 发送请求
          • 提取数据
          • 返回
      • 数据不在当前的url的地址
        • 在其他的的响应中 寻找数据的位置
          • chrome network寻找
    • 数据的提取
      • xpath,从html中提取数据
      • re 提取一些数据
      • json j
  • 保存

    • 保存在本地 text json csv
    • 保存在数据库中
文章作者: Mr joe
文章链接: http://mrjoe.cc/2018/06/24/根据所学做小爬虫案例/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mrjoe的博客
欢迎关注哦