zoukankan      html  css  js  c++  java
  • 爬虫1.1-基础知识+requests库

    爬虫-基础知识+requests库

    关于html的知识,可以到w3school中进行了解学习。http://www.w3school.com.cn/html/index.asp,水平有限,这里不多提及。

    1. 状态返回码

    标志这这一次的请求状态,成功或失败,失败原因大概是什么

    200:请求正常,服务器正常返回数据。 不代表爬去到正确信息了
    301:永久重定向,比如访问www.jingdong.com 会重定向到www.jd.com
    302:临时重定向,比如访问一个需要登陆的网站时,因为没有登陆会重定向到登陆页面
    400:请求的url在服务器上找不到。url错误
    403:服务器拒绝,权限不够
    500:服务器内部错误,服务器出现bug

    2. URL各个字段解释

    URL:scheme://host:port/path/?query-string=xxx#anchor
    scheme: 代表的是访问的协议,http https ftp...
    host:主机名,域名,baidu.com
    port:端口号,一般浏览器默认80
    path:查询路径,文件在服务器中的位置
    query-string:查询字符串,例如www.baidu.com/s?wd=python
    anchor:锚点,前端用于给关键词定位的

    示例

    https://www.baidu.com/s?ie=UTF-8&wd=python

    https://baike.baidu.com/item/html标签/6999473?fr=aladdin#2

    2. requests库

    requests库是python中一个非常强大的网络请求库,常用来写一些小爬虫、

    浏览器抓包:使用谷歌浏览器,按F12点击Network,再按F5刷新页面即可抓包查看请求头(Requst Headers)和

    表单(Form Data)数据,拷贝到自己的代码中即可防止被服务器发现一个爬虫。

    get请求:

    import requests
    response = requests.get(url, headers=headers)
    print(response.content.decode('utf-8')) 
    # 网页编码不全都是utf-8格式,也有可能是gbk,可以在浏览器中右键查看网页源代码,一般在最开头几行有标识 utf-8或则gb2313
    # headers配置件下方代码块。
    

    headers 是需要构建的请求头字典,配置见下方代码块。
    网页源代码:response.content.decode('utf-8') 最好自己解码, temp.text自动解码,但可能出错
    其他属性response.encoding响应头编码 response.status_code查看响应码 response.url 查看url

    post请求:

    import requests
    data = {
        'username': 'xxx',
        'password': 'xx',
        'random': 'xxxx',
    }
    headers = {
       	'Cookie': "xxx",
        'Referer': 'xx',
        'User-Agent': 'xxxx'
    }
    response = requests.post(url, data=data, headers=headers)
    

    其中url应该是可以接受post请求的url

    data是提交的表单,需要在浏览器中先检查好格式,然后在代码中模仿

    headers是请求头,为字典形式,一般需要加入'User-Agent' 'Cookie' 'Referer'字段,这几个字段的知识百度即可,注意headers通常都是需要添加的,如果没有添加,很可能被识别为爬虫,从而被服务器拒绝访问。

    代理:

    proxy = {'http':'ip:port'}
    temp = requests.get(url, headers=headers, params=params, proxies=proxy) 
    

    从参数来看似乎可以加入多个代理ip,内部有自动处理方法

    会话:
    s = requests.Session() 创建会话类
    s.post/get (url1,xxx) 成功后会保存cookie等信息 然后再访问其他网页即可
    s.get(url2)

    处理HTTPS协议时,证书不被信任,直接request.get(url, verify=False)

    更多实战代码,请查看其他笔记。

    3. requests库爬虫的基本流程

    前面提到requests库适用于小爬虫,对于整站爬取这种工作是不适宜的,原因在于url防重控制和异步问题。

    3.1 爬虫框架

    第一步,分析需要爬取页面的规则,例如爬取拉勾网搜索python关键词之后的全部岗位,拉勾网先给出一个职位简介列表,点击没一个简介即可进入每个职位的详情页,而我们的爬虫正是需要解析这些详情页里面的内容。根据浏览器的user-agent, cookie, referer等字段伪造请求头。

    第二步,分析url变化规则,例如boss直聘网的python职位列表变化在于page=x,所以只要在代码中加入

    for x in (1, max+1) ,就可以遍历所有的列表,在其中取得详情页的url,其中max为网站中给出的最大值。

    https://www.zhipin.com/c101270100/?query=python&page=4

    第三步,使用xpath或者正则,在列表页中提取出详情页的url并访问,利用xpath或者正则表达式提取想要的信息

    第四步,将信息存储(json, csv, txt等)

    3.2 一个样例代码

    # 古诗文网爬虫,正则表达式提取信息
    
    import re
    import csv
    import requests
    
    
    # 头部
    HEADERS = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
        'Cookie': 'sec_tc=AQAAAOnYGRKNjAwAc6jZqzitZLqPPmaN; Hm_lvt_04660099568f561a75456483228a9516=1543214277; ASP.NET_SessionId=q2b21uwthctq4aad0vbc5x5e; Hm_lpvt_04660099568f561a75456483228a9516=1543214320',
        'referer': 'https://www.gushiwen.org/default_1.aspx',
    }
    
    # 处理页面信息的函数
    def parse_page(url):
        global data  # data是列表,用于存储每篇古诗字典
        response = requests.get(url, headers=HEADERS)
        response_text = response.text
        # 四个正则表达式 选中大范围再缩小范围,   .*?作用是非贪婪模式 获取两个标签之间的所有内容
        titles = re.findall(r'<divsclass="cont">.*?<b>(.*?)</b>', response_text,re.DOTALL)
        dynasties = re.findall(r'<p class="source">.*?<a.*?>(.*?)</a>', response_text)
        authors = re.findall(r'<span>:</span>.*?<a.*?>(.*?)</a>', response_text)
        contens = re.findall(r'<div class="contson" id=.*?>(.*?)</div>', response_text, re.DOTALL)
        poeminfo = {}
        for i in contens:
            contens[contens.index(i)] = re.sub(r'<.*?>', "", i).strip()  # .strip()函数用于去除
     空格等
    
        # zip函数是将多个列表依次打包,[1,2] [3,4]会被组合成(1,3) (2,4)
        for value in zip(titles, dynasties, authors, contens,):
            title, dynasty, author, content = value  # 这里相当于解包并对应取值
            poeminfo = {
                'title': title,
                'dynasty': dynasty,
                'author': author,
                'content': content
            }
            data.append(poeminfo)  # 存入列表
    
    
    def get_url():
        url_list = []
        base_url = 'https://www.gushiwen.org/default_{}.aspx'
        for i in range(1, 100):
            url = base_url.format(i)
            url_list.append(url)
        return url_list
    
    
    def csv_write(data):
        # 构造头部
        csv_headers = ['title', 'dynasty', 'author', 'content']
        with open('gushici.csv', 'w', encoding='utf-8', newline='') as fp:
            writer = csv.DictWriter(fp, csv_headers)
            writer.writeheader()
            writer.writerows(data)
            fp.close()
    
    
    if __name__ == '__main__':
        data = []
        list = get_url()
        for url in list:
            parse_page(url)
            for i in data:
                print(i)
            print("=" * 50)
            print(url)
            print("=" * 50)
        csv_write(data) # 将获取的数据写入csv文件
    
    

    作者:bitterz
    本文版权归作者和博客园所有,欢迎转载,转载请标明出处。
    如果您觉得本篇博文对您有所收获,请点击右下角的 [推荐],谢谢!
  • 相关阅读:
    C++Builder中的异常传递
    lpc1343 usb isp not work in linux and mac
    玩玩Hiweed linux 2.0
    有关 stringWithString 和 initWithString
    Windows mobile 中获取内存使用情况
    玩玩xubuntu 8.10
    升级我的ipaq hx2110到Windows Mobile 6.0
    面试技巧 from IBM
    常用Sql语句
    c#的事件机制示例代码: 猫> 老鼠, 主人
  • 原文地址:https://www.cnblogs.com/bitterz/p/10194852.html
Copyright © 2011-2022 走看看