爬虫案例-爬取CSDN博文和糗事百科段子

前面学习了基本的浏览器伪装的方式,现在来看三个实例:

例1 爬取CSDN首页的博文 思路很简单,伪装浏览器之后,通过正则获取对应的url链接,然后把对应的url的文章都下载下来

#!/usr/bin/env python
#! -*- coding:utf-8 -*-
# Author: Yuan Li

import re,urllib.request

url="http://blog.csdn.net/"
header=("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36")

opener=urllib.request.build_opener()
opener.addheaders=[header]
data=opener.open(url).read().decode('UTF-8')
print(data)
pat='<a href="(http://blog.*?)" target=.*'
urllist=re.compile(pat).findall(data)


for i in range(len(urllist)):
    print(urllist[i])
    urllib.request.urlretrieve(urllist[i],'c:\\temp\\download\\%s.html'%i)

结果如下

例2 爬取糗事百科的段子

这个比起第一个例子来说,稍微复杂了一点点。

首先呢,我们需要爬取前面35页的段子,需要分析url的格式,每次翻页爬取的时候,都需要伪装浏览器,因此需要把伪装的User-Agent设置为全局的模式;

第二点,我们在正则匹配的时候使用了模式修饰符re.S。这是为什么呢,因为一个段子有很多行,默认情况下,小圆点只会匹配除了换行以外的所有符号,我们可以强制要求他匹配所有的符号包括换行符

具体的说明可以参考官方文档 https://docs.python.org/3/howto/regex.html

import urllib.request
import re
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
#安装为全局
urllib.request.install_opener(opener)
for i in range(0,35):
    thisurl="http://www.qiushibaike.com/8hr/page/"+str(i+1)+"/?s=4948859"
    data=urllib.request.urlopen(thisurl).read().decode("utf-8","ignore")
    pat='<div class="content">.*?<span>(.*?)</span>.*?</div>'
    rst=re.compile(pat,re.S).findall(data)
    for j in range(0,len(rst)):
        print(rst[j])
        print("-------")

结果如下:


早晨去吃牛肉面,正在吃~~~~<br/>来了一位美女。<br/>老板,来碗牛肉面,<br/>大碗小碗的?<br/>早晨刚起床,大份(大粪)吃不下,来小份(小粪)的吧<br/>对面坐的大哥,你的面条怎么从鼻孔里出来了???


接上一条,不能一次发两张图郁闷


在食堂买饭,要了咖喱猪排饭。有个男生要了咖喱牛肉饭。<br/>一会饭熟了,阿姨说:咖喱牛好了。<br/>对我说:咖喱猪等一会


这地铁工艺广告看着不对劲啊!脖子有点脱节!这手也是特别畸形!P上去的吧!?


楼主是个敏感的人,读书时,经常因别人一句话不顺耳,就跟人家打架,树敌颇多,奈何我身强力壮,倒也没输过。<br/>有天放学回家的路上,突然出现几个大孩子拦着我,我一瞅,这,人多势众,不能吃眼前亏,忽然看到我妹妹走过来,赶紧喊:“二妹,快过来帮忙,她们人多!”<br/>我妹瞅着我们,结结巴巴的说:“我,我,我不认识她,我不是她妹妹,”说完风一样的跑了……<br/>二十几年了……现在你说你要结婚,问我送你什么礼物??<br/>送你赶快滚!


偷过人的朋友举手,不管男人女人,举手看看有多少。


有个妹纸发信息到我手机上说这个号码是她以前用的。现在无聊就打打玩玩,结果聊的特别嗨。慢慢的没怎么联系了。<br/>一晃5 6 年过去了。<br/>忽然今天想起这事。打电话到我以前的号码。居然联系上了。 我擦。(最巧的是我和那个妹子是同年同月同日的)<br/>不过5、6年了。她也结婚生子了。祝她幸福。对了今天我生日。生日快乐。周小洵。


因为孩子,和公婆住过一段时间。<br/>我对他们越好,他们事越多。比如,给他们买衣服,他们说我乱花钱。对他们好一点,他们觉得我无事献殷勤,想图谋他们财产。。。。。后来矛盾越来越多。<br/>到了后来,我婆婆直接对我说:滚!<br/><br/>后来,我就辞职了,带上钱去了远处,另外找工作。<br/>可我还在路上,车上,我婆婆就打电话给我老公,叫我回去。还说,如果我不喜欢原来的工作,可以给我另外找工作。让我别走。<br/>我愣了,实在不明白为什么?<br/>是觉得我好么?<br/>那为何说那么难听的话?<br/>是觉得我不好吗?<br/>那为啥说,滚?<br/>也许是因为我走了,他们自 …


我们是来跳广场舞的!哈哈


好长时间没给儿子买汉堡了,今天德克士会员日买一送一。和老公去吃,回来帮他带了一个,儿子放学回家告诉他有汉堡,他竟然说,今个太阳从西边出来了,不过说话时有着莫名的喜感


这都没人吃到。。?


例3 用户代理池的构建

这个在例2的基础上构建了一个列表,列表里面是多个User-Agent的内容,每次爬取的时候随机的获取一个User-Agent,这样对于网站而言,看起来好像是同一个IP地址不同的浏览器发出的请求,可以更好地实现反爬的效果。

知识点: random.choice可以随机地从列表选取一个内容

import urllib.request
import re
import random
uapools=[
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393",
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
    ]

def ua(uapools):
    thisua=random.choice(uapools)
    print(thisua)
    headers=("User-Agent",thisua)
    opener=urllib.request.build_opener()
    opener.addheaders=[headers]
    #安装为全局
    urllib.request.install_opener(opener)

for i in range(0,35):
    ua(uapools)
    thisurl="http://www.qiushibaike.com/8hr/page/"+str(i+1)+"/?s=4948859"
    data=urllib.request.urlopen(thisurl).read().decode("utf-8","ignore")
    pat='&lt;div class="content"&gt;.*?&lt;span&gt;(.*?)&lt;/span&gt;.*?&lt;/div&gt;'
    rst=re.compile(pat,re.S).findall(data)
    for j in range(0,len(rst)):
        print(rst[j])
        print("-------")
相关文章
相关标签/搜索