使用Python网络爬虫收集51cto频道所有文章题目以及配置
优采云 发布时间: 2021-08-20 22:39使用Python网络爬虫收集51cto频道所有文章题目以及配置
项目实现:使用Python网络爬虫采集51cto频道的所有文章话题和相关链接,通过修改程序中的相关参数即可实现所有文章采集。
项目工具:Fiddler
51cto、csdn等都是被网络爬虫禁止访问的,所以先让Python爬虫伪装成浏览器,然后以模拟浏览器的形式访问51cto等网站。此处将使用 Fiddler 工具。 可以直接从Fiddler官网点击打开链接下载Fiddler,下载后直接打开安装即可。网络上有很多Fiddler相关的配置,这里就不详细介绍了。首先打开51cto首页,点击左上角“频道”-大数据,在页面底部看到“加载更多”选项,然后打开Fiddler,点击“加载更多”,Fiddler页面在这次如图:
此时Fiddler界面中的Client就是我们用来访问51cto网站的真实浏览器的头部信息。该信息可用于使爬虫伪装成浏览器。在Python编程中,我们可以按照如下格式设置头信息:
#模拟浏览器
headers = {"Accept": "*/*",
"Accept-Encoding": "utf-8, gb2312",
"Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0",
"Connection": "keep-alive",
"referer": "51cto.com"
}
cjar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
headall = []
for key, value in headers.items():
item = (key, value)
headall.append(item)
opener.addheaders = headall
urllib.request.install_opener(opener)
如果我们使用同一个IP抓取同一个网站网页,很可能会被网站服务器拦截。为了避免IP被屏蔽,可以使用代理服务器点击打开链接,点击打开链接,在程序设计中,对于代理服务器的设置,我们采用如下形式:
#创建代理服务器
def use_proxy(proxy_addr, url):
try:
proxy = urllib.request.ProxyHandler({'http': proxy_addr})
opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
urllib.request.install_opener(opener)
data = urllib.request.urlopen(url).read().decode('utf-8')
return data
#异常处理机制
except urllib.error.URLError as e:
if hasattr(e, 'code'):
print(e.code)
if hasattr(e, 'reason'):
print(e.reason)
time.sleep(10)
except Exception as e:
print("exception-->"+str(e))
time.sleep(1)
设置好模拟浏览器和代理服务器后,我们开始进入相关网页的主题爬取。
通过Fiddler分析网页行为,实现文章的自动加载。在Fiddler获取浏览器头信息的界面中,Fiddler抓到了session信息,如图:
点击session信息,可以看到session信息的header请求详情:
复制 URL 并再次单击“加载更多”以获取另一个 URL。观察规律,发现
(1)type_id为文章51cto通道的type id,type_size为文章每次加载的编号
(2)page字段加1,callback=kjsonp "......"加1
因此,我们可以构造出文章的URL地址进行抓取
url = "http://other.51cto.com/php/get_channel_recommend_art_list.php?" \
"callback=jsonp" + str(contentid) + "&page=" + str(page) + \
"&type_id=" + typeid + "&type=recommend&page_size=" + str(pagesize)
打开复制的网址,可以看到如下内容:
分析内容,我们可以得到如下字段;
"title":"BBC\uff1a\u6570\u636e\u5e26\u6765\u7684\u5f0a\u75c5\uff1f\u8fd1\u56e0\u6548\u5e94",
"picname":"http:\/\/\/wyfs02\/M02\/8F\/4A\/wKiom1jaCFejo_GmAACiPt3NL7056.jpeg-wh_173x112-wm_-s_329470"p