美文网首页
爬虫组队学习——task1

爬虫组队学习——task1

作者: migugu | 来源:发表于2020-04-21 16:30 被阅读0次

    互联网与HTTP

    爬虫需要了解的网络连接知识不多,只需要知道最基本的连接原理即可。
    HTTP是一个客户端(用户)服务器端(网站)之间进行请求和应答的标准,客户端发出请求(即requests)到服务器,服务器返回响应的文件(即response)。

    HTTP请求方法
    GET 向指定的资源发出“显示”请求,应该只用于读取数据(GET可能会被网络蜘蛛等随意访问。
    HEAD 与GET方法一样,是向服务器发出直顶资源的请求,使用这个方法可以在不必传输内容的情况下,将获取到其中“关于该资源的信息”(元信息或元数据)。
    POST 向指定资源提交数据,请求服务器进行处理。数据被包含在请求文本中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
    PUT 向指定资源位置上传输最新内容。
    DELETE 请求服务器删除Request-URL所标识的资源。
    TRACE 回显服务器收到的请求,主要用于测试或诊断。
    OPTIONS 这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用“*”来代表资源名称向Web服务器发送OPTIONS请求,可以测试服务器共能是否正常。
    CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的连接(经由非加密的HTTP代理服务器)。方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。

    网络基础

    网页是由 HTML 、 CSS 、JavaScript 组成的。

    • HTML:搭建整个网页的骨架
    • CSS:美化页面
    • JavaScript:让整个网页“动起来”,网页的数据动态交互、 JavaScript 配合 CSS 完成网页上的动画。

    爬虫原理

    爬虫的原理就是模拟浏览器对目标网站发送请求,然后从网站返回的数据中提取有用的数据,并将有用的数据存放于数据库或文件中。

    1. 模拟计算器对服务器发起request请求
    2. 接收服务器端的response内容并解析、提取所需的信息
    3. 存储数据

    一个爬虫最普遍的过程:

    1. 访问站点;
    2. 定位所需的信息;
    3. 得到并处理信息。

    使用开发者工具检查网页

    Chrome的开发者模式为用户提供了下面几组工具。

    • Elements:允许用户从浏览器的角度来观察网页,用户可以借此看到Chrome渲染页面所需要的HTML、CSS和DOM(Document Object Model)对象。

    • Network:可以看到网页向服务气请求了哪些资源、资源的大小以及加载资源的相关信息。此外,还可以查看HTTP的请求头、返回内容等。

    • Source:即源代码面板,主要用来调试JavaScript。

    • Console:即控制台面板,可以显示各种警告与错误信息。在开发期间,可以使用控制台面板记录诊断信息,或者使用它作为shell在页面上与JavaScript交互。

    • Performance:使用这个模块可以记录和查看网站生命周期内发生的各种事情来提高页面运行时的性能。

    • Memory:这个面板可以提供比Performance更多的信息,比如跟踪内存泄漏。

    • Application:检查加载的所有资源。

    • Security:即安全面板,可以用来处理证书问题等。

    以python官网的“python之禅”为例,在Chrome中打开https://www.python.org/dev/peps/pep-0020/ ,按f12检查网页。

    爬取python之禅

    import requests
    url = "https://www.python.org/dev/peps/pep-0020/"
    r = requests.get(url)
    r.status_code # 查看状态码
    r.text
    print(r.text[r.text.find('<pre')+28:r.text.find('</pre>')-1])
    

    实战—爬取豆瓣电影top50

    豆瓣电影top250的url为https://movie.douban.com/top250,250条电影记录分布在10页中,经过简单分析,在换页时,url发生改变。

    第一页:https://movie.douban.com/top250?start=0&filter=
    第二页:https://movie.douban.com/top250?start=25&filter=
    第三页:https://movie.douban.com/top250?start=50&filter=

    不难发现,每增加一页,url中的参数start值就增加25,故可以使用循环获得url列表,再根据url获取源码。

    # 获取url列表
    def get_urllist():
        urllist = []
        for i in range(0,250,25):
            url = 'https://movie.douban.com/top250?start='+str(i)+'&filter='
            urllist.append(url)
        return urllist
    

    接下来分析对源码进行解析,首先获取源码。

    在爬取网页时,返回的status_code不是200而是418,原因是被网站的反爬程序返回。因此,在请求时,添加下列语句修改headers。

    headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}
    r = requests.get(url,headers=headers)
    
    # 获取源码
    def get_html(url):
        headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}
        r = requests.get(url, headers=headers)
        return r.text
    

    以第一页为例,发现需要的信息都在<li>标签中,所以需要定位li标签提取所需要的信息。


    但是,又发现在真正含有所需要信息的<li>标签qian ,还有19个干扰的<li>标签。而这19个标签正好前19个li标签,所以很好办,直接从第20个标签开始提取就行。

    接下来再对所需信息进行分析

    不难发现,排名为<em标签的文本内容,影片名为<span class="title"标签的文本内容,链接为<a 标签中href属性对应的值,名言为标签<span class=“inq” 的文本内容,评分为<span class=“rating_num” property=“v:average” 的文本内容。
    获取这些信息后,就可以利用find方法定位内容,进行提取。

    # 解析源码
    def prase_html(html):
        soup = BeautifulSoup(html) # 使用lxml解析库
        items = soup.find_all(name = li) # 查询标签为li的元素
        for i in items[19:]: # 排除前19个li标签
            yield {
                'title': item.span.get_text(),
                'index': item.find(name='em').text,
                'image': item.find(name='a')['href'],
                'quote': item.find(class_="inq").text,
                'score': item.find(class_="rating_num").text
            }
    

    接下来将数据转化为json字符串并写入到文件中

    def write_to_file(content):
        with open("douban_top250.txt", 'a', encoding='utf-8') as f:
            f.write(json.dumps(content, ensure_ascii=False) + '\n') 
    

    相关文章

      网友评论

          本文标题:爬虫组队学习——task1

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