urllib 是一个收集了多个用到 URL 的模块的包:
- urllib.request 打开和读取 URL
- urllib.error 包含 urllib.request 抛出的异常
- urllib.parse 用于解析 URL
- urllib.robotparser 用于解析 robots.txt 文件
本文所述主要针对urllib.request
模块,其中示例代码是基于python3,python2相应的功能略有不同。
本文示例代码实现以下功能:
- 模拟浏览器请求简书首页。
- 解析首页html,得到文章列表url。
- 根据文章俩请求访问文章
- 解析文章url,判断当前用户是否以为该文章点赞,如果没有点赞,则对它进行自动点赞
构造request
from urllib import request
def make_request(url):
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/53...ML, like Gecko) Chrome/68.0.3440.84 Safari/537.36"
}
req = request.Request(url, headers=headers)
return req
上面代码使用指定的url
构造了一个request
,并为其指定了headers
,在headers
指定了User-Agent
,有些网站不允许没有User-Agent
访问,这里可一根据需要填充其他字段,比如Content-Type
、accept
等等。
使用cookiejar处理cookie
假定已经使用浏览器登录成功,并把cookie保存在cookie.txt文件中。
这里使用cookiejar处理cookie,从文件中加载cookie。
from http import cookiejar
cookie_file = "cookie.txt"
cookie = cookiejar.MozillaCookieJar()
cookie.load(cookie_file)
使用opener发起请求
def get_page(url):
req = make_request(url)
cookie_file = "cookie.txt"
cookie = cookiejar.MozillaCookieJar()
cookie.load(cookie_file)
opener = request.build_opener(request.HTTPCookieProcessor(cookie))
resp = opener.open(req)
cookie.save(filename=cookie_file, ignore_discard=True, ignore_expires=True)
return resp.read()
说明:
- 构造request
- 从文件中加载cookie
- 使用cookie处理器
HTTPCookieProcessor
构建一个opener - 调用
opener.open()
发起请求。 - 保存更新cookie文件
使用etree模块解析html
from lxml import etree
root = etree.HTML(html)
lst = root.xpath("//*[@id='list-container']/ul/li/a/@href")
for item in lst:
article_url = homeurl + item
if zan(article_url):
#print(article_url)
break
etree是解析html的利器,使用方法xpath解析文章url地址。
然后遍历文章列表,为其点赞。
POST请求
def zan(article_url):
# step 1
html = get_page(article_url)
root = etree.HTML(html)
if root.xpath("//div[@class='_2Z1aZJ']"):
return False
# step 2
url = root.xpath("//meta[@property='al:android:url']/@content")[0]
id = url[url.rindex('/') + 1:]
url = "https://www.jianshu.com/shakespeare/notes/{}/like".format(id)
# step 3
cookie_file = "cookie.txt"
cookie = cookiejar.MozillaCookieJar()
cookie.load(cookie_file)
opener = request.build_opener(request.HTTPCookieProcessor(cookie))
# step 4
req = make_request(url)
req.headers['method'] = "POST"
req.headers['accept'] = 'application/json'
# step 5
data ={"note_id": int(id), "energy_point": 3}
data = json.dumps(data).encode('utf-8')
req.data = data
# step 6
resp = opener.open(req)
print(resp.read())
return True
说明:
- step 1:抓取文章页面,解析html中是否存在class为‘_2Z1aZJ’的div,如果不存在,说明该文章已经被当前用户点赞过
- step 2:加载cookie
- step 3:解析构造点赞的url地址
- step 4:构造request,指定method为POST,模拟ajax。
- step 5:request附加数据,一个json对象,包含一个id和点赞的等级。
- step 6:最后发起请求。
😃😃😃😃😃😃😃😃The End😃😃😃😃😃😃😃😃😃
本文代码旨在学习,对于自己点赞还是要根据自己喜欢,觉得有价值的手动去点才好😃。
网友评论