入门Python爬虫Day1

python爬虫

此文章大致需要观看十五分钟


Python作为现阶段最流行的语言,对于网络的爬取和海量数据的分析,python更胜一筹。

  • 介绍一下Python的第三方库引入,python3使用import作为第三方模块引入的关键词。urllib则提供了一系列用于操作URL的功能,对于常见的Get、Post以及Handler操作均可做到。(若想了解url方面知识,请寻找专业人士讲解,在此不多介绍,日后提供url讲解。)
import urllib.request
  • 之后我们便可使用python访问浏览器网页url,我们只需要提供其url地址方可执行Python访问网页环境,使用response接受访问后的返回结果。
response = urllib.request.urlopen('http://www.baidu.com/', None, 2)
  • 首先打印一下response的结果我们会发现我们得到了一个迭代HTTPResponse信息。
print(response)
-> <http.client.HTTPResponse object at 0x0000025EA8AA2A48>
  • 我们可以将此迭代信息读取出来参数返回给html变量,为了防止读取中文字符错误,在这里我们选择使用utf-8编码进行返回。
html = response.read().decode('utf8')
  • 将html内容写入到txt中方可查看我们所获取到的内容。
f = open('code1.txt', 'w', encoding='utf8')
f.write(html)
f.close()

打开文件夹我们可以发现其中的内容很乱,可能刚入门的程序员并看不懂html源码的内容,不着急我们慢慢来。

源码展示:

# 导入urllib
import urllib.request
# 打开URL
response = urllib.request.urlopen('http://www.baidu.com/', None, 2)
# 读取返回的内容
html = response.read().decode('utf8')
# 写入txt
f = open('code1.txt', 'w', encoding='utf8')
f.write(html)
f.close()

  • 刚才我们讲了一下Python的源代码下载到本地txt中,但是这并不是所有的网站均可用刚才方法访问。
  • 接下来介绍一下网页的robots.txt文件夹以及headers的请求头添加。
  • robots.txt为各个网站中程序员都会添加的一个可读取文件,里面装有user-Agent访问权限问题,此文件是给网页主人和爬虫人士的一些双方都需要遵守的一些约定准则,对于爬虫来说,我们也需要知法懂法!

  • 但是呢,如果爬虫人士都需要遵守爬虫约定的话,则网页可能都不能允许我们进行爬虫了,拿上节课做的代码我们可以访问一下豆瓣网页,会发现 已经报错了?
import urllib.request
response = urllib.request.urlopen('http://movie.douban.com/', None, 2)
-->  urllib.error.HTTPError: HTTP Error 418: 
  • 看到报错信息我们应该能知道,http响应为418,这是因为豆瓣网站检测到python所带来的网页请求头,非人工进入网页给出的异常请求码,目的禁止爬虫人士访问

  • 那我们该怎么办?就此放弃了么?不可能!
  • 我们以豆瓣网站为例进行讲解。
  • python中urllib.request.Request可以提供多个参数,其中包含headers信息来构造较真实的请求头。
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'
    'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
    'Referer': 'https://movie.douban.com/',
    'Connection': 'keep-alive'}
  • 此headers信息为常规请求头信息,User-Agent为网页的请求头,在此可以看出您是用什么系统什么浏览器访问的此网页,我所给出的为Windows系统chrome谷歌浏览器访问请求头信息(也是比较常用的,此信息必须加入headers中),Referer信息会告诉该服务器该网页是从哪个页面链接过来的(可加可不加),Connection为网页当前ID是否存活,HTTP请求发送之前,需要先建立TCP连接,只有TCP连接建立,才可以发送HTTP请求。而keep-alive说明此链接已经建立。
  • 之后可以将代码带入到Request中
response = urllib.request.Request('https://movie.douban.com/', headers=headers)
  • 这时response返回正常,说明headers请求头已给入python访问浏览器中。
  • 我们可以使用urlopen打开response信息。
html = urllib.request.urlopen(response).read().decode('utf-8')
  • 之后将豆瓣网页源代码写入txt中,保存到本地方便我们观看。
f = open('code2.txt', 'w', encoding='utf8')
f.write(html)
f.close()

完整代码:

# 导入urllib
import urllib.request
url = 'https://movie.douban.com/'
# 自定义请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'
    'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
    'Referer': 'https://movie.douban.com/',
    'Connection': 'keep-alive'}
# 设置request的请求头
req = urllib.request.Request(url, headers=headers)
# 使用urlopen打开req
html = urllib.request.urlopen(req).read().decode('utf-8')
# 写入文件
f = open('code2.txt', 'w', encoding='utf8')
f.write(html)
f.close()

在这里给出常用User-Agent请求头:

import random
user_agent = [
    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
    "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    "Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    "MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    "Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10",
    "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
    "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+",
    "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0",
    "Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)",
    "UCWEB7.0.2.37/28/999",
    "NOKIA5700/ UCWEB7.0.2.37/28/999",
    "Openwave/ UCWEB7.0.2.37/28/999",
    "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999",
]
headers = {'User-Agent': random.choice(user_agent)}
  • 接下来讲讲设置代理的重要性。
  • 代理的作用很多,比如突破自身IP访问限制、隐藏真实IP、提高访问速度都是代理的作用,爬虫若不设置时间睡眠则会对网站服务器造成DDoS攻击,网站管理员便可认为这种单ip网络访问为爬虫现象直接封杀此ip禁止访问网页。

  • 首先我们还是需要引入urllib.request模块,定义爬虫url网址。
import urllib.request
url = 'https://movie.douban.com/'
  • 我们需要设置代理proxy_handler,在urllib.request库中,通过ProxyHandler来设置使用代理服务器。
proxy_handler = urllib.request.ProxyHandler({
    'http': '218.56.132.157:8080',
    'https': '183.30.197.29:9797'})
  • 必须使用build_opener()函数来创建带有代理IP功能的opener对象
opener = urllib.request.build_opener(proxy_handler)
response = opener.open(url)
  • 后续操作进行爬虫下载
html = response.read().decode('utf-8')
f = open('code3.txt', 'w', encoding='utf8')
f.write(html)
f.close()

  • 完整代码
import urllib.request
url = 'https://movie.douban.com/'
# 设置代理IP
proxy_handler = urllib.request.ProxyHandler({
    'http': '218.56.132.157:8080',
    'https': '183.30.197.29:9797'})
opener = urllib.request.build_opener(proxy_handler)
response = opener.open(url)
html = response.read().decode('utf-8')
f = open('code3.txt', 'w', encoding='utf8')
f.write(html)
f.close()
  • 爬虫对于网站的cookie信息则需要保存好了,避免每次使用爬虫都需要登录会显得非常麻烦,运行速度大幅度下降。

  • html库中含有对cookie信息的处理器,可以携带cookie信息访问您所访问的网页,非常方便。
  • 导入urllib和http库
import urllib.request
from http import cookiejar
  • cookiejar可以将cookies信息存储在本地,方便我们下一次取用cookie信息。
  • HTTPCookieProcessor可以创建cookie的处理器进行cookie携带访问网页。
cookie = cookiejar.MozillaCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
  • 定义opener变量带有headers信息,opener中可携带cookie信息访问网页。
opener = urllib.request.build_opener(handler)
response = opener.open('https://movie.douban.com/') # 使用open打开网页
  • 完整代码
import urllib.request
from http import cookiejar
filename = 'cookie.txt'
cookie = cookiejar.MozillaCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('https://movie.douban.com/')
cookie.save() #cookie信息进行保存,方便下次使用

  • html也可以读取本地txt的cookie信息代码,我们可以将cookie保存到本地txt中方便python进行读取,之后携带cookie传入网站进行登录
  • 读取cookie信息:cookiejar.MozillaCookieJar().load("cookie.txt")
  • 完整代码
import urllib.request
from http import cookiejar
filename = 'cookie.txt'
cookie = cookiejar.MozillaCookieJar()
cookie.load(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('https://movie.douban.com/')
print(cookie)

  • 对于网站来说ssl证书很重要,对于有的网站,需要验证证书,而我们则需要在代码中导入可添加的证书。
  • 导入request以及ssl库
import urllib.request
import ssl
  • 添加证书
ssl._create_default_https_context = ssl._create_unverified_context#用这个就不能用requests了,得用urllib2.Request才行
  • 然后我们即可访问成功网页
  • 完整代码
import urllib.request
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
url = 'https://kyfw.12306.cn/otn/leftTicket/init'
response = urllib.request.urlopen(url)
print(response.getcode()) # 打印网页返回码 --- 200

谢谢观看。

发布了13 篇原创文章 · 获赞 25 · 访问量 1507

猜你喜欢

转载自blog.csdn.net/qq_45414559/article/details/104948275
今日推荐