需求:爬取CSDN资讯页http://blog.csdn.net/nav/news的所有新闻,每个文章内容单独生成一个本地网页存到本地中。
难点:需要进行浏览器伪装、循环爬各文章。
思路:先爬首页,然后通过正则筛选出所有文章url,然后通过循环分别爬取这些url到本地。
实现:
首先观察该网页的源代码:
注意到每个新闻页被<h2>标签所包围,编写代码:
import urllib.request
import re
#浏览器伪装
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6726.400 QQBrowser/10.2.2265.400")
opener=urllib.request.build_opener() #添加为全局,很重要
opener.addheaders=[headers]
data1=opener.open("http://blog.csdn.net/nav/news").read()
data2=data1.decode("utf-8")
pat='<h2>\n.*?<a href="(.*?)"'
allurl=re.compile(pat).findall(data2)
print(len(allurl))
for i in range(0,len(allurl)):
try:
print("第"+str(i)+"次爬取")
thisurl=allurl[i]
print(thisurl)
file="F:/csdnnews/"+str(i)+".html"
urllib.request.urlretrieve(thisurl,file)
print("-------成功-------")
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)