美文网首页
使用urllib包实现爬虫

使用urllib包实现爬虫

作者: 不思九八 | 来源:发表于2020-01-02 23:07 被阅读0次

    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-Typeaccept等等。

    使用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😃😃😃😃😃😃😃😃😃
    本文代码旨在学习,对于自己点赞还是要根据自己喜欢,觉得有价值的手动去点才好😃。

    相关文章

      网友评论

          本文标题:使用urllib包实现爬虫

          本文链接:https://www.haomeiwen.com/subject/ileaoctx.html