有道爬虫源代码分析

此方式使用Python 基本的标准库urllib.request进行爬虫,基于Python3
对于有登陆的方式爬虫可以参考下面一段代码
import urllib.request
from http import cookiejar
cj = cookiejar.Cookjar(‘cookie.txt’)
handler = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
urllib.request.install_opener(handler)
再使用opener去访问相应的网站
和其相同的requests方式:
session = requests.Session()
session = session.post(url = url,data = data,headers = headers)
content = session.get(url = url)
可以获得相应的网址的源代码,通过 正则表达式(re),lxml pyquery,BeautifulSoup等获取目标的工具进行解析。

有道爬虫源代码分析_第1张图片

#-- coding:utf8 --

”’第一行代码表示下边整个文本是utf8编码python2须书写,因为Python2的编码是ASCII,而Python3.x使用的utf8编码”’

#导入urllib.request库用于访问网络的一个库,也可以使用requests的库总体来说requests库更加简单实用

import urllib.request

#用于压缩文件的一个库

import gzip
import urllib.parse
import json
import time
import random
import hashlib

#目标网址
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
# 定义变量通过谷歌浏览器分析浏览器post的数据
client = 'fanyideskweb'
#时间戳
ctime = int(time.time() * 1000)
salt = str(ctime + random.randint(1, 10))
key = 'rY0D^0\'nM0}g5Mm1z%1G4' #注意修改以前版本的秘钥
#sign加密方式通过md5加密可以通过浏览器分析,md5存在于hashlib包中sha1也存在于此包中,此加密方式和知乎登陆的效果方式极为相似,可以通过前端代码分析知乎登陆的表单信息。
'''主要难点:sign的参数获得'''
key = 'ebSeFb%=XZ%T[KZ)c(sy!'
sign = hashlib.md5((client + content + salt + key).encode('utf-8')).hexdigest()
print(sign)
# 通过谷歌浏览器或者Fidder抓包工具填入表单数据
data = {}
data['i'] = content
data['from'] = 'AUTO'
data['to'] = 'AUTO'
data['smartresult'] = 'dict'
data['client'] = 'fanyideskweb'
data['salt'] = salt
data['sign'] = sign
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
#注意抓包时此参数和以前参数有有所不同,只需要按照浏览器获得参数书写即可
data['action'] = 'FY_BY_REALTIME'
data['typoResult'] = 'false'
data = urllib.parse.urlencode(data).encode('utf-8')
# 请求头将请求伪装成浏览器需要以下一些操作
head = {}
head['Accept'] = 'application/json, text/javascript, */*; q=0.01'
head['Accept-Encoding'] = 'gzip, deflate'
head['Accept-Language'] = 'zh-CN,zh;q=0.9'
head['Connection'] = 'keep-alive'
head['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'
head['Cookie'] = '[email protected]; JSESSIONID=aaa9_E-sQ3CQWaPTofjew; OUTFOX_SEARCH_USER_ID_NCOO=2007801178.0378454; fanyi-ad-id=39535; fanyi-ad-closed=1; ___rl__test__cookies=' + str(
    ctime)
head['Host'] = 'fanyi.youdao.com'
head['Origin'] = 'http://fanyi.youdao.com'
#反盗连防止被封ip
head['Referer'] = 'http://fanyi.youdao.com/'
#伪装成浏览器进行访问
head['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
head['X-Requested-With'] = 'XMLHttpRequest'
#使用urllib.request进行请求输入,方式通过浏览器的数据可以看出是post请求。
#使用requests的方式不失为一种更好的方式,response = requests.get(data = data,headers = headers)
#而且requests有一种方法.json()可以直接使用,无需再倒入json包,注意请求网页的编码,如果是utf8编码的话需要response.encoding = 'utf8'
request = urllib.request.Request(url, data, head)
response = urllib.request.urlopen(request)
#读取数据
with gzip.open(response, 'rb') as f:
    response = f.read()
    # response=response.read().decode('utf-8')
#json方式将字符串转化成字典格式并且获得里面需要数据
target = json.loads(response)
result = target['translateResult'][0][0]['tgt']
return result

if _ name _ == “_ main _” :

content = input('请输入需要翻译的内容:')
print(translate(content))

你可能感兴趣的:(有道爬虫源代码分析)