持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
发送post请求
爬一下百度翻译,试试怎么才能返回正确结果
首先要先准备好url
"https://fanyi.baidu.com/v2transapi?from=en&to=zh"
然后准备好data
{"from": "en", "to": "zh", "query": "cat", "transtype": "realtime", "simple_means_flag": "3",
"sign": "661701.982004", "token": "token", "domain": "common"}
这个都是百度翻译时传的数据,然后这个data啊,需要urllib.parse.urlencode转一下,再encode一下,十分麻烦啊
返回的结果也是一个字节码。需要使用json.loads解析成utf-8格式的编码才能认识,
import urllib.request
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
headers = {
'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36",
'Cookie':'xx'
}
url = "https://fanyi.baidu.com/v2transapi?from=en&to=zh"
data = {"from": "en", "to": "zh", "query": "cat", "transtype": "realtime", "simple_means_flag": "3",
"sign": "661701.982004", "token": "471c5b3cbdada6147e8dd1d2dd0e76a0", "domain": "common"}
data = urllib.parse.urlencode(data).encode('utf-8')
print(data)
request = urllib.request.Request(url, data=data, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
import json
obj = json.loads(content)
print(obj)
如果header中不携带cookie,会返回未知错误。所以必须传入正确的cookie
爬行豆瓣网站的数据
基本流程都是一样
- 准备请求对象
- 获取响应数据
- 下载数据 首先让用户填写自己要抓取的开始页和结束页 根据用户选定的范围,循环遍历,然后请求多次,每次先准备数据,然后发送请求,获取数据,然后下载数据到本地保存为json文件。当循环结束,程序也就执行完成。数据保存完毕
if __name__=='__main__':
start_page=int(input('起始的页码'))
end_page=int(input('请输入结束的页码'))
for page in range(start_page,end_page):
request = creat_request(page)
content = get_content(request)
donw_load(content, page)
定制请求的request对象。封装成一个function
def creat_request(page):
headers = {
'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36",
}
baseurl = "https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action="
data = {
'start': (page - 1) * 20,
'limit': 20
}
data = urllib.parse.urlencode(data)
url = baseurl + data
request = urllib.request.Request(url=url, headers=headers)
return request
发送请求也是封装成一个函数,接受上一个函数的返回值作为参数,把上面的请求对象当成这个请求对象参数,然后获取响应数据,直接返回回去
def get_content(request):
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
return content
再定义一个解析函数。把上面得到的结果转换成文本并且写入到文件系统中。所有的数据都保存成json文件。到此,程序执行完毕。
def donw_load(content, page):
with open('douban' + str(page) + '.json', 'w', encoding='utf-8') as fp:
fp.write((content))
上面就是完整的豆瓣分页获取电影的代码啦。