本文参考与Jack-Cui 的python3网络爬虫入门系列
领悟:python的灵活性远远超过了我的想象 我们没有必要写一样的代码,但是我们可以学习不同的思路!!!!
Python3网络爬虫(一):利用urllib进行简单的网页抓取
# -*- coding: UTF-8 -*-
from urllib import request
import chardet
if __name__ == "__main__":
# 访问网页
response = request.urlopen("http://fanyi.baidu.com")
# 获取内容
html = response.read()
# 得到编码
charset=chardet.detect(html)
# 转码
res=html.decode(charset['encoding']);
# 写入文件
with open('a.html',encoding='utf-8',mode='w')as f:
f.write(res)
Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
# -*- coding: UTF-8 -*-
from urllib import request
from urllib import parse
import json
if __name__ == "__main__":
#对应上图的Request URL
Request_URL = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=https://www.baidu.com/link'
#创建Form_Data字典,存储上图的Form Data
Form_Data = {}
Form_Data['type'] = 'AUTO'
Form_Data['i'] = 'Jack'
Form_Data['doctype'] = 'json'
Form_Data['xmlVersion'] = '1.8'
Form_Data['keyfrom'] = 'fanyi.web'
Form_Data['ue'] = 'ue:UTF-8'
Form_Data['action'] = 'FY_BY_CLICKBUTTON'
#使用urlencode方法转换标准格式
data = parse.urlencode(Form_Data).encode('utf-8')
#传递Request对象和转换完格式的数据
response = request.urlopen(Request_URL,data)
#读取信息并解码
html = response.read().decode('utf-8')
#使用JSON
translate_results = json.loads(html)
#找到翻译结果
translate_results = translate_results['translateResult'][0][0]['tgt']
#打印翻译信息
print("翻译的结果是:%s" % translate_results)
此方法与今天已经被和谐,,上了n多算法进去,会提示翻译的结果是:您的请求来源非法,商业用途使用请关注有道翻译API官方网站“有道智云”
# -*- coding: UTF-8 -*-
from urllib import request
from urllib import error
if __name__ == "__main__":
# try catch 处理 保证了代码的健壮性
#一个不存在的连接
url = "http://www.douyua.com/Jack_Cui.html"
# URLError
# [Errno 11001] getaddrinfo failed
url = "http://www.douyu.com/Jack_Cui.html"
# HTTPError
# 403
req = request.Request(url)
try:
responese = request.urlopen(req)
except error.URLError as e:
if hasattr(e, 'code'):
print("HTTPError")
print(e.code)
elif hasattr(e, 'reason'):
print("URLError")
print(e.reason)
常见的User Agent
1.Android
Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P1000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
2.Firefox
Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0
Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0
3.Google Chrome
Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36
Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19
4.iOS
Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3
Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A101a Safari/419.3
上面列举了Andriod、Firefox、Google Chrome、iOS的一些User Agent,直接copy就能用。
代理IP选取
在写代码之前,先在代理IP网站选好一个IP地址,推荐西刺代理IP。
URL:http://www.xicidaili.com/
编写代码访问http://www.whatismyip.com.tw/,该网站是测试自己IP为多少的网址,服务器会返回访问者的IP。
用法
import requests, sys
url = 'https://www.yzwlzy.com/'
proxy = {
'http':'27.155.83.126:8081',
'http':'58.54.136.82:9999'
}
try:
headers={
'User-Agent':'Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0'
}
response = requests.get(url, proxies=proxy, timeout=5,headers=headers)
print(response.text)
print(response.content.decode('utf-8'))
except requests.exceptions.ConnectionError:
print('超时')
1.直接使用指令pip3 install scrapy,发现有诸多错误。
building 'twisted.test.raiser' extension
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/
http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 下载twisted对应版本的whl文件(如我的Twisted‑17.5.0‑cp36‑cp36m‑win_amd64.whl),cp后面是python版本,amd64代表64位,运行命令:
pip install C:\Users\CR\Downloads\Twisted-17.5.0-cp36-cp36m-win_amd64.whl
安装完成后,再次运行:
pip install Scrapy
即可成功。
cookie这一个 概念很重要,如果要学协议的话,就必须懂得cookie是什么东西所以不懂的话 请花费些许时间去了解一下
打印cookie
def getCookie():
# 声明一个CookieJar对象来保存cookie
cookie = cookiejar.CookieJar();
# 利用urllib.request库的HTTPCookieProcessor对象来创建cookie处理器,也就CookieHandler
handler = request.HTTPCookieProcessor(cookie)
# 通过CookieHandler创建opener
opener = request.build_opener(handler)
# 此处的open方法打开网页
opener.open("https://www.yzwlzy.com")
# 打印cookie信息
for item in cookie:
print("Name=%s" % item.name)
print("Value=%s" % item.value)
保存cookie到本地。。之前不会api还用序列化方式读取和保存的 可以参考下使用序列化保存和读取cookie
def saveCookie2File():
# 设置保存cookie的文件,同级目录下的cookie
filename = 'cookie.txt'
# 声明一个MozillaCookieJar对象来保存cookie。之后写入文件
cookie = cookiejar.MozillaCookieJar(filename)
# 理由urlib.request库中的HTTPCookieProcessor对象来创建cookie处理器 也就CookieHandler
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler);
opener.open("https://www.yzwlzy.com")
cookie.save(ignore_discard=True, ignore_expires=True)
pass
从本地读取
def readCookie2File():
fileName = 'cookie.txt';
# 创建MozillaCookieJar实例对象
cookie = cookiejar.MozillaCookieJar();
# 从文件中读取cookie内容到变量
cookie.load(fileName, ignore_discard=True, ignore_expires=True);
# 利用urllib.request库中农的HTPPCookieProcessor对象来创建cookie处理器,也就CookieHandler
handler = request.HTTPCookieProcessor(cookie)
# 通过opener的open方法打开网页
opener = request.build_opener(handler)
# 此用opener的open方法打开网页
response = opener.open('https://www.yzwlzy.com');
# 打印信息
print(response.read().decode('utf-8'))
pass
到项目上就可以灵活的应用,
def loginMyWebSite():
userName = '马赛克emmmm';
password = '马赛克emmmm';
url = 'https://www.yzwlzy.com/login.php';
url_index='https://www.yzwlzy.com/'
fileName = 'yzwlzy_cookie.txt';
if os.path.isfile(fileName):
# 有缓存,就直接使用
cookie = cookiejar.MozillaCookieJar();
cookie.load(fileName,ignore_discard=True,ignore_expires=True);
cppkie_support = request.HTTPCookieProcessor(cookie);
opener = request.build_opener(cppkie_support);
response=opener.open(url_index)
html = response.read().decode('utf-8')
res = re.findall('管理员:(.*?) <', html)
print(res)
return True
else:
# 没有文件 就创建文件缓存
cookie = cookiejar.MozillaCookieJar(fileName);
cppkie_support = request.HTTPCookieProcessor(cookie);
opener = request.build_opener(cppkie_support);
data = {
'username': userName,
'password': password,
'gourl': '/index.php',
}
# 使用urlencode方法转换标准格式
datepostdata = parse.urlencode(data).encode('utf-8');
req = request.Request(url=url, data=datepostdata)
try:
response = opener.open(req);
html = response.read().decode('utf-8')
res = re.findall('管理员:(.*?) <', html)
if (len(res) == 1 and res[0] == userName):
# 登录成功保存缓存
cookie.save(ignore_discard=True,ignore_expires=True)
print(res)
return True
except error.URLError as e:
if hasattr(e, 'code'):
print("HTTP Error:%d" % e.code)
elif hasattr(e, 'reason'):
print('URLError:%s' % e.reason)
return False
pass