Python之网络爬虫(3)

本博客内容来自韦玮老师网络爬虫课堂笔记,仅用于个人学习和复习,请勿转载用于其他商业用途。

浏览器伪装技术原理

 当我们爬CSDN博客,我们会发现返回403,因为对方服务器会对爬虫进行屏蔽。此时,我们需要伪装成浏览器才能爬取。

浏览器伪装,我们一般通过报头进行。

我们还是用TED官网进行试验。首先我们输入https://www.ted.com/#/,然后按F12键,在network中任意打开一个链接,然后选中headers栏,就可以看到header(报头)对应的相应的信息。

 其中,最重要的部分为用红色笔标注出来的User-Agent部分,因为网站通过这个部分识别我们浏览网页使用的是浏览器还是爬虫。如果是浏览器的话,内容就是红色笔标注的部分。通过这种方式,我们也知道如何通过修改报头内容将自己伪装称为浏览器。

下面我们用其他的网页操作一下:

import urllib.request
url = "https://blog.csdn.net/csdnnews/article/details/103094601"
headers = ("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
data = opener.open(url).read()
fh = open("D:/PROGRAMMING/数据分析/Python数据分析与挖掘实战视频教程/实验/4.html", "wb")
fh.write(data)
fh.close()

在视频中老师的代码爬取成功,但是现实中我们在爬CSDN博客的时候是失败的。有可能是CSDN进行了更高级别的爬虫屏蔽?

那我们还是回头再爬一下TED网站吧……

结果是:成功了!!!

下面附上爬取TED的代码和结果:

import urllib.request
url = "http://www.ted.com/#/"
headers = ("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
data = opener.open(url).read()
fh = open("D:/PROGRAMMING/数据分析/Python数据分析与挖掘实战视频教程/实验/4.html", "wb")
fh.write(data)
fh.close()

我们通过记事本打开可以看到,整个网页都被爬了下来:

扫描二维码关注公众号,回复: 9351700 查看本文章

Python新闻爬虫实战

需求:将新浪新闻首页所有新闻都爬到本地。

思路:先爬首页,通过正则表达式获取所有新闻链接,然后依次爬各新闻,并储存到本地。

我们先打开新浪新闻的网页,查看源代码,然后在源代码中寻找相应的新闻标题,比如:

我们可以发现,符合的新闻的格式都是 href="https://news.sina.com.cn ...

因此,我们就可以用正则表达式来找了。

import urllib.request
import re
import urllib.error

data = urllib.request.urlopen("http://news.sina.com.cn/").read()
data2 = data.decode("utf-8", "ignore")
pat = 'href="(https://news.sina.com.cn/.*?)"'
allurl = re.compile(pat).findall(data2)
for i in range(0, len(allurl)):
    try:
        print("第" + str(i) + "次爬取")
        thisurl = allurl[i]
        file = "D:/PROGRAMMING/数据分析/Python数据分析与挖掘实战视频教程/实验/sinanews/" + 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)

#
第0次爬取
----爬取成功----
第1次爬取
----爬取成功----
第2次爬取
----爬取成功----
...
略

我们打开文件夹确认一下:

发布了27 篇原创文章 · 获赞 9 · 访问量 988

猜你喜欢

转载自blog.csdn.net/sinat_42574069/article/details/103106556