4.request + xpath爬取网页数据

1.requests是一个第三方模块,是urllib.requset的封装,功能比urllib.request强大,使用更方便.

requsets的安装: pip install requests

import requests
from fake_useragent import UserAgent
import random
    
# 创建useragent对象
us = UserAgent()
headers = {
        "User-Agent": us.random 
    }
    
# 创建代理池
proxy_list = [
        {"代理协议": "代理的ip"},
        {'http': "42.59.86.21:1133"},
        {'https': "42.59.86.21:1133"},
        ......
    ]
    
# 随机选择一个代理ip
proxy = random.choice(proxy_list)
url = "请求的网址"
    
# cookies = {
        # 以获取的cokies
        "":"",
        "":"",
        ......
    }
 # requsets的GET请求
 # 可以直接通过 proxies参数设置代理
 # 也可以直接设置cookie
  response = requests.get(url, headers=headers, proxies=proxy, cookies=cookies)
  # 对象响应有如下操作
  print(response.__dict__) # 查看对象所有属性
  print(response.text)  # 返回字符串内容
  print(response.content) # 返回二进制内容
  print(response.content.decode()) # 返回字符串,默认编码utf-8
  print(response.json()) # requests自带json解析
  print(response.status_code) # 返回状态码
  print(response.cookies) # 获取cookies
  print(response.url) # 获取请求网址
  print(response.headers) # 获取请求头
--------------------------------------------------------    
    # 也可以获取响应对象中的cookies
    # 获取cookie
    res_cookies = response.cookies
    # 将cookiejar转换成字典
    print(requests.utils.dict_from_cookiejar(res_cookies))
 ---------------------------------------------------------   
    # 也可以通过session来自动保存cookies
    import requests

    # 笔趣阁登录
    url = "https://www.biquge5200.cc/u/login.htm"
    data = {
        # 用户名: niejeff, 密码: 123456
        "name": "niejeff",
        "password": "E10ADC3949BA59ABBE56E057F20F883E",
        "autoLogin": "1",
        "autologin": "1"
    }

    headers = {
        'User-Agent': "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
    }

    # 使用session: 自动保存和提交cookie
    session = requests.session()

    # 登录
    response = session.post(url, data=data, headers=headers)
    print(response.text)
    -------------------------------------------------------
    # requests 中的SSL认证
    import requests

    # 要想检查某个主机的SSL证书,你可以使用 verify 参数(也可以不写)
    response = requests.get("https://www.baidu.com/", verify=True)

    # 忽略验证, 可以省略不写或设置为verify=False
    response = requests.get("https://www.baidu.com/", verify=False)

    print(response.text)

    # 如果出现下面的错误,则忽略SSL证书
    # SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)


    # auth验证
    # 如果提示: Requires authentication, 添加auth参数
    auth=('test', '123456')
    response = requests.get('https://api.github.com/user', auth=auth)
    print(response.text)
  1. xpath用来解析,查找,过滤网页数据

xpath的安装:pip install lxml
xpath的常用语法

/ : 获取子节点,默认选取根节点。
// : 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. : 选取当前节点。
..: 选取当前节点的父节点。
@ : 选取属性。

2.1.以获取京东数据为例

import requests      # 导入requests
from lxml import etree      # 导入xpath
import time     # 导入时间模块 
from spider_jd.proxys import proxys    # 自定义代理ip模块
from spider_jd.user_agent import user   # 自定义用户代理 user_agent 模块


# 获取静态页面部分数据
def crawl_first(num):
    # 设置用户代理
    user_agent = user()
    headers = {
        'User-Agent': user_agent,
        'authority': 'search.jd.com',
        'method': 'GET',
        'path': '/s_new.php?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=4&s=74&scrolling=y&log_id=1562323559.30035&tpl=3_M&show_items=100005945610,5089273,5089235,100000822969,8790521,100003936976,47716923931,3133841,7652089,47847150993,100005819880,100000856861,46971161949,7437564,100003332220,8058010,100000972490,100003475378,100001247225,100000287133,100005150846,1861091,100003490442,7652091,100003336101,100002433196,100004544992,100003207541,100000766433,100005088618',
        'scheme': 'https',
        'cookie': 'shshshfpa=ea747a7e-66d3-d02e-43d0-ac87be9b0c90-1546772120; shshshfpb=smbRYXeZEqVbOIUQUwQguGQ%3D%3D; qrsc=3; __jdc=122270672; __jdv=122270672|baidu|-|organic|not set|1562307212304; __jdu=1561809008634351058752; areaId=19; ipLoc-djd=19-1607-3155-0; PCSYCityID=1607; xtest=9587.cf6b6759; rkv=V0600; __jda=122270672.1561809008634351058752.1561809008.1562307212.1562314874.3; 3AB9D23F7A4B3C9B=3YDZC2ANDPEZWOXX5SJRD2YMFTT3VIKVQPGFXB5HZCBN6OJ7H4TPWJ643OIP5NDNSX6UJ5YUUNM52HATIF66ZSSFPI; shshshfp=ffea12491b36e16b6aa589b093d49865',
        'referer': 'https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=3&s=5&click=0',
        'x-requested-with': 'XMLHttpRequest'
    }
    # 设置代理ip
    proxies = proxys()
    # 待爬url
    url = 'https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&' \
          'enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page={}'.format(num*2-1)
    # 发送请求,并返回响应
    response = requests.get(url=url, headers=headers, proxies=proxies)
    response.encoding = 'utf-8'
    html = response.text
    # 创建xpath对象
    tree = etree.HTML(html)
    # 获取全部手机的li
    phone_li = tree.xpath('//*[@id="J_goodsList"]/ul/li')
    with open('JD_Phone.csv', 'a', newline='', encoding='utf-8')as fp:
        for phone in phone_li:
                try:
                    # 价格
                    p_price = phone.xpath('./div/div[3]/strong/i/text()')[0]
                    # 标题
                    p_title = phone.xpath('./div/div[4]/a/@title')[0]
                    # 直卖店
                    p_shop = phone.xpath('./div/div[7]/span/a/@title')
                except Exception as e:
                    print(e)
                try:
                    string = 'title:%s,price:%s,shop:%s' % (p_title, p_price, p_shop)
                    fp.write(string + '\n')
                    fp.flush()
                except Exception as s:
                    print(s)


# 获取动态加载部分数据
def crawl_last(num):
    a = time.time()
    b = "%.5f" % a
    # 设置用户代理
    user_agent = user()
    headers = {
        'User-Agent': user_agent,
        'authority': 'search.jd.com',
        'method': 'GET',
        'path': '/s_new.php?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=4&s=74&scrolling=y&log_id=1562323559.30035&tpl=3_M&show_items=100005945610,5089273,5089235,100000822969,8790521,100003936976,47716923931,3133841,7652089,47847150993,100005819880,100000856861,46971161949,7437564,100003332220,8058010,100000972490,100003475378,100001247225,100000287133,100005150846,1861091,100003490442,7652091,100003336101,100002433196,100004544992,100003207541,100000766433,100005088618',
        'scheme': 'https',
        'cookie': 'shshshfpa=ea747a7e-66d3-d02e-43d0-ac87be9b0c90-1546772120; shshshfpb=smbRYXeZEqVbOIUQUwQguGQ%3D%3D; qrsc=3; __jdc=122270672; __jdv=122270672|baidu|-|organic|not set|1562307212304; __jdu=1561809008634351058752; areaId=19; ipLoc-djd=19-1607-3155-0; PCSYCityID=1607; xtest=9587.cf6b6759; rkv=V0600; __jda=122270672.1561809008634351058752.1561809008.1562307212.1562314874.3; 3AB9D23F7A4B3C9B=3YDZC2ANDPEZWOXX5SJRD2YMFTT3VIKVQPGFXB5HZCBN6OJ7H4TPWJ643OIP5NDNSX6UJ5YUUNM52HATIF66ZSSFPI; shshshfp=ffea12491b36e16b6aa589b093d49865',
        'referer': 'https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=3&s=5&click=0',
        'x-requested-with': 'XMLHttpRequest'
    }
    # 设置代理ip
    proxies = proxys()
    # 待爬url
    url = 'https://search.jd.com/s_new.php?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page={}&s={}&scrolling=y&log_id={}'.format(2*num, 48*num-20, b)
    # 发送请求,并返回响应
    response = requests.get(url=url, headers=headers, proxies=proxies)
    print(response.url)
    response.encoding = 'utf-8'
    html = response.text

    # 创建xpath对象
    tree = etree.HTML(html)
    # 获取全部手机的li
    phone_li = tree.xpath('//*[@id="J_goodsList"]/ul/li')
    print(phone_li)
    with open('JD_Phone.csv', 'a', encoding='utf-8')as fp:
        for phone in phone_li:
                try:
                    # 价格
                    p_price = phone.xpath('./div/div[3]/strong/i/text()')[0]
                    # 标题
                    p_title = phone.xpath('./div/div[4]/a/@title')[0]
                    # 直卖店
                    p_shop = phone.xpath('./div/div[7]/span/a/@title')
                except Exception as e:
                    print(e)

                string = 'title:%s,price:%s,shop:%s' % (p_title, p_price, p_shop)
                print(string)
                fp.write(string + '\n')
                fp.flush()


if __name__ == '__main__':
    for num in range(1):
        print('开始爬取静态数据部分')
        crawl_first(num)
        print('crawl_first:%s结束' % num)
        print('*'*100)
        print('开始爬取动态加载数据部分')
        crawl_last(num)
        print('crawl_last:%s结束' % num)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容