精华内容
下载资源
问答
  • Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3) 1. 异步加载爬虫  对于静态页面爬虫很容易获取到站点的数据内容,然而静态页面需要全量加载站点的所有数据,对于网站的访问和带宽是巨大的挑战,...

    Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3)

    1. 异步加载爬虫

      对于静态页面爬虫很容易获取到站点的数据内容,然而静态页面需要全量加载站点的所有数据,对于网站的访问和带宽是巨大的挑战,对于高并发和大访问访问量的站点来说,需要使用AJAX相关的技术来实现异步加载,即根据需要来获取数据,以pexels网站为例,按F12,切换到Network的XHR标签,通过下拉菜单访问该站点,此时数据会以此加载,在XHR页面中会逐步增加访问的URL地址,点击查看其中一个URL地址,发现其URL的地址类似为:https://www.pexels.com/search/book/?page=3&seed=2018-02-22+05:21:39++0000&format=js&seed=2018-02-22 05:21:39 +0000,将其修改为https://www.pexels.com/search/book/?page=3,并修改page后面数的值发现可以访问到不同的页面内容,以此来构造需要访问的url站点内容。

    2. 代码内容

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    #!/usr/bin/python

    #_*_ coding:utf _*_

    #author: HappyLau

    #blog: https://www.cnblogs.com/cloudlab

     

    import os

    import sys

    import time

    import os.path

    import random

    import requests

    from lxml import etree

     

    reload(sys)

    sys.setdefaultencoding('utf8')

     

    def get_jianshu(url):

        '''

        demo简书网站的获取信息

        '''

        headers = {"User-Agent""Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"}

        try:

            req = requests.get(url,headers=headers)

            if req.status_code == 200:

                return req.text.encode('utf8')

            else:

                return ''

        except Exception as e:

            print e

     

    def get_picture(url,download_dir):

        '''

        @params:获取url中的图片信息,并将其下载到download_dir目录中

        @download_dir:图片下载的本地路径

        '''

        if not os.path.exists(download_dir):

            os.mkdir(download_dir)

        html = get_jianshu(url)

        selector = etree.HTML(html)

        for url in selector.xpath('//img[@class="photo-item__img"]/@src'):

            picture_name = url.split("?")[0].split("/")[-1]

            print "downloading picutre %s" % (picture_name)

            with file(download_dir + picture_name,'wb') as f:

                f.write(requests.get(url).content)

            time.sleep(random.randint(1,3))

     

    if __name__ == "__main__":

        url_lists = ['https://www.pexels.com/search/book/?page={}'.format(i) for in range(1,21)]

        for url in url_lists:

            get_picture(url,'/root/pexels')

    3. 下载图片使用方式

      上面使用requests.get().content的方式来实现下载图片的方法,还可以通过urllib.urlretrieve()方法来实现图片的下载功能,该函数的使用参数为:retrieve(self, url, filename=None, reporthook=None, data=None),其中url地址为需要访问的url路径,filename为本地存放图片的路径,修改代码内容如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    #!/usr/bin/python

    #_*_ coding:utf _*_

    #author: HappyLau

    #blog: https://www.cnblogs.com/cloudlab

     

    import os

    import sys

    import time

    import os.path

    import random

    import requests

    import urllib

    from lxml import etree

     

    reload(sys)

    sys.setdefaultencoding('utf8')

     

    def get_jianshu(url):

        '''

        demo简书网站的获取信息

        '''

        headers = {"User-Agent""Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"}

        try:

            req = requests.get(url,headers=headers)

            if req.status_code == 200:

                return req.text.encode('utf8')

            else:

                return ''

        except Exception as e:

            print e

     

    def get_picture(url,download_dir):

        '''

        @params:获取url中的图片信息,并将其下载到download_dir目录中

        @download_dir:图片下载的本地路径

        通过利用urllib模块中的urlretrieve()方法实现图片的下载功能

        '''

        if not os.path.exists(download_dir):

            os.mkdir(download_dir)

        html = get_jianshu(url)

        selector = etree.HTML(html)

        for url in selector.xpath('//img[@class="photo-item__img"]/@src'):

            picture_name = download_dir + "/" + url.split("?")[0].split("/")[-1]

            print "downloading picutre %s" % (picture_name)

            urllib.urlretrieve(url,picture_name)            #下载图片

            time.sleep(random.randint(1,3))

     

    if __name__ == "__main__":

        url_lists = ['https://www.pexels.com/search/book/?page={}'.format(i) for in range(1,21)]

        for url in url_lists:

            get_picture(url,'/root/pexels')

      

    展开全文
  • python爬虫异步加载

    2020-12-11 00:54:08
    异步加载一.AJAX技术介绍二.JSON介绍三.异步GET与POST请求 一.AJAX技术介绍 AJAX是Asynchronous JavaScript And XML的首字母缩写,意为异步JavaScript与XML。 使用AJAX技术,可以在不刷新网页的情况下更新网页数据...

    一.AJAX技术介绍

    AJAX是Asynchronous JavaScript And XML的首字母缩写,意为异步JavaScript与XML。
    使用AJAX技术,可以在不刷新网页的情况下更新网页数据。使用AJAX技术的网页,一般会使用HTML编写网页的框架。
    在打开网页的时候,首先加载的是这个框架。剩下的部分将会在框架加载完成以后再通过JavaScript从后台加载。
    AJAX 的一种常见用法是使用 AJAX 加载 JSON 数据,然后在浏览器端渲染。如果能直接抓取到 JSON 数据,会比 HTML 更容易解析。
    AJAX 实际上也是通过 HTTP 传输数据的。

    二.JSON介绍与应用

    JSON的全称是JavaScript Object Notation,是一种轻量级的数据交换格式。网络之间使用HTTP方式传递数据的时候,绝大多数情况下传递的都是字符串。
    因此,当需要把Python里面的数据发送给网页或者其他编程语言的时候,可以先将Python的数据转化为JSON格式的字符串,然后将字符串传递给其他语言,其他语言再将JSON格式的字符串转换为它自己的数据格式。
    不仅是字典,Python中的列表或者包含字典的列表,也可以转换为JSON格式的字符串,
    如果要把JSON格式的字符串转换为Python的字典或者列表,只需要使用一行代码即可:
    如下图
    这里得到的json_data就是一个字典,可以像使用普通字典一样来使用它。

    #-*- cdoeing = utf-8 -*-
    #@Time :    2020-12-11
    #name : LBOcean
    import json
    
    json_data = {
      'basic_info': {'name': 'LBOcean',
               'age': 20,
               'sex': 'max',
               'merry': False}
      }
    print("json_data的数据类型为:",type(json_data))
    json_data_str= json.dumps(json_data,indent=4)#indent 缩进的意思
    print(json_data_str,'son_data_str的数据类型为:',type(json_data_str))
    
    json_data_dict = json.loads(json_data_str)
    print(json_data_dict,'json_data_dict的数据类型为:',type(json_data_dict))
    

    在这里插入图片描述

    三.异步GET与POST请求

    这里我们就用kingname的链接: http://exercise.kingname.info/exercise_ajax_1.html.做练习对象,由于这个网站不需要请求头,我就没有添加heads

    先点开这个连接看一下,我们可以看到如下两段话
    在这里插入图片描述
    那我们是不是可以尝试着拿下这两段话.

    import requests
    url = 'http://exercise.kingname.info/exercise_ajax_1.html'
    home = requests.get(url).content.decode()
    print(home)
    

    在这里插入图片描述

    结果发现拿下来是这种样式,文本根本不在html里面.
    现在许多网页都采用了这种叫做异步加载的数据模式.
    我们就要来分析一下,如何获取到这里面的内容

    在这里插入图片描述

    这里我们可以看到这个请求使用GET方式,发送到http://exercise.kingname.info/ajax_1 backend,接下来我们试一试_

    import requests
    url = 'http://exercise.kingname.info/ajax_1_backend'
    home = requests.get(url).content.decode()
    print(home)
    

    在这里插入图片描述

    同样的道理,我们分析下面的一个post请求

    在这里插入图片描述

    这里我们可以看到,这是使用POST方式向http://exercise.kingname.info/ajax_1_postbackend 发送请求,并以JSON格式提交数据

    在这里插入图片描述

    这里可以看到是以JSON格式来提交数据的,所以我们也需要提交一份json数据,才能有反馈值

    import requests
    url = 'http://exercise.kingname.info/ajax_1_postbackend'
    json_data = {'name' : 'LBOcean' , 'age' : 20}
    home = requests.post(url,json=json_data).content.decode()
    print(home)
    

    在这里插入图片描述

    可以看到我们很顺利的拿到了,想要的数据

    展开全文
  • python爬虫爬取异步加载的数据

    千次阅读 2019-02-02 22:07:38
    python爬取异步加载的数据 爬取qq音乐歌手数据接口数据 https://y.qq.com/portal/singer_list.html 这是歌手列表的网址 分析网页 f12开发者选项 找到network 里面有异步加载的数据 刷新看找数据 看他们的response...

    python爬取异步加载的数据

    爬取qq音乐歌手数据接口数据

    https://y.qq.com/portal/singer_list.html
    这是歌手列表的网址

    分析网页

    • f12开发者选项 找到network 里面有异步加载的数据
    • 刷新看找数据在这里插入图片描述
      看他们的response

    https://u.y.qq.com/cgi-bin/musicu.fcg?-=getUCGI20652690515538596&g_tk=944669952&loginUin=1638786338&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0&data={"comm"%3A{"ct"%3A24%2C"cv"%3A0}%2C"singerList"%3A{"module"%3A"Music.SingerListServer"%2C"method"%3A"get_singer_list"%2C"param"%3A{"area"%3A-100%2C"sex"%3A-100%2C"genre"%3A-100%2C"index"%3A-100%2C"sin"%3A0%2C"cur_page"%3A1}}}
    会有一个网址的response是歌手列表就是上述网址 记住这个网址然后就是请求这个网址

    • 先贴源码
    import jsonpath
    import json
    import requests
    import csv
    import time
    def writecsv(content):
    	with open('spider2.csv','a+',encoding='utf-8',newline='') as filecsv:
    		writer = csv.writer(filecsv)
    		writer.writerow(content)
    writecsv(['歌手名','歌手地区','歌手id','歌手图片'])
    def getHtml(url):
    	response=requests.get(url)
    	response.encoding='utf-8'
    	html=response.text
    	html=json.loads(html)
    	print(html)
    	singname=jsonpath.jsonpath(html,'$..singerList..singer_name')
    	singcountry=jsonpath.jsonpath(html,'$..singerList..country')
    	singer_mid=jsonpath.jsonpath(html,'$..singerList..singer_mid')
    	singer_pic=jsonpath.jsonpath(html,'$..singerList..singer_pic')
    	print(singer_mid)
    	for index,i in enumerate(singname):
    		writecsv([i,singcountry[index],singer_mid[index],singer_pic[index]])
    index=0
    for i in range(0,801,80):
    	index=index+1
    	getHtml('https://u.y.qq.com/cgi-bin/musicu.fcg?-=getUCGI01616088836276819&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0&data={"comm":{"ct":24,"cv":0},"singerList":{"module":"Music.SingerListServer","method":"get_singer_list","param":{"area":-100,"sex":-100,"genre":-100,"index":-100,"sin":%(no)d,"cur_page":%(page)d}}}'% {'no':i,'page':index})
    	time.sleep(3)
    # index=0
    # for i in range(0,801,80):
    # 	index=index+1
    # print(i)
    # print(index)
    

    这里用到json jsonpath最后都保存为csv格式文件方便实用
    html=json.loads(html)这里是将网页数据保存为json格式然后通过jsonpath解析json文件jsonpath语法类似xpath可以看下教程在这里插入图片描述
    使用jsonpath.jsonpath()解析json格式的数据$是根节点不能丢

    singname=jsonpath.jsonpath(html,'$..singerList..singer_name')

    {
    “singerList”: {
    “data”: {
    “area”: -100,
    “genre”: -100,
    “index”: -100,
    “sex”: -100,
    “singerlist”: [
    {
    “country”: “内地”,
    “singer_id”: 5062,
    “singer_mid”: “002J4UUk29y8BY”,
    “singer_name”: “薛之谦”,
    “singer_pic”: “http://y.gtimg.cn/music/photo_new/T001R150x150M000002J4UUk29y8BY.webp
    },
    {
    “country”: “内地”,
    “singer_id”: 1199300,
    “singer_mid”: “0013RsPD3Xs0FG”,
    “singer_name”: “半阳”,
    “singer_pic”: “http://y.gtimg.cn/music/photo_new/T001R150x150M0000013RsPD3Xs0FG.webp
    },

    这里…代表绝对哪里有就匹配到哪相当于xpath的//singlist下的singer_name很好找到可以先打印一下看错误再改依次将歌手名歌手国家等打印出来因为他们的个数都是相同的采用枚举的方式将每一个按行写入csv格式

    with open('spider2.csv','a+',encoding='utf-8',newline='') as filecsv:第一个参数是文件名,第二个参数是追加读方式,第三个是编码方式避免乱码,第四个是控制空行删除空行,会自动生成这个csv文件成功后看有没有多出来的csv文件打开后
    在这里插入图片描述
    这样一个简单的异步加载的数据的爬取就成功了

    展开全文
  • 如何用python爬取异步加载的网页?以京东商品评论为例。 在用python爬取网页时,会遇到网页不是一次性全部加载的情况,这种网页会在某种操作后,才加载对应的部分,拿京东来说,点进商品页面,并不会直接加载评论...

    如何用python爬取异步加载的网页?以京东商品评论为例。

    在用python爬取网页时,会遇到网页不是一次性全部加载的情况,这种网页会在某种操作后,才加载对应的部分,拿京东来说,点进商品页面,并不会直接加载评论部分内容,而是在点击“评论”标签后才会加载第一页评论的内容,点击“下一页”之后,才会加载第二页评论的内容。

    对于这些异步加载的内容,直接爬取的方式是行不通的,所以要通过找到异步加载内容的url来实现内容爬取。

    第一步,打开某一商品页面,打开开发者工具,进入到Network一栏。

    在这里插入图片描述

    第二步,点击网页中的商品评价,然后发现Network中会多出许多项。

    在这里插入图片描述

    第三步,依次点击Network中多出的项目,找出评论所在的位置。

    在这里插入图片描述

    第四步,右击这个部分的名称,依次选择Copy——Copy link address,得到“https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=12413062&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1”,这就是评论内容的url,改变“page=”后的数字,可以切换评论的不同页。打开复制的地址,出现以下页面,发现评论都在content的后边,于是就可以利用content定位来截取评论内容。

    在这里插入图片描述

    完整代码如下:

    from requests_html import HTMLSession
    import time
    
    session = HTMLSession()
    
    a = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=12413038&score=0&sortType=5&page='
    b = '&pageSize=10&isShadowSku=0&fold=1'
    
    for i in range(10):
        link = a+str(i)+b
        r = session.get(link)
        str_all = r.text
        end = 1
        for i in range(10):
            start = str_all.find('content',end)
            end = str_all.find(',',start)
            print(str_all[start+10:end-1])
        time.sleep(10)

    也可参考:利用Python自动翻译文本

    展开全文
  • 爬取qq音乐歌手数据接口数据 ...f12开发者选项 找到network 里面有异步加载的数据 刷新看找数据 看他们的response https://u.y.qq.com/cgi-bin/musicu.fcg?-=getUCGI20652690515538596&g_...
  • 1. 异步加载爬虫 对于静态页面爬虫很容易获取到站点的数据内容,然而静态页面需要全量加载站点的所有数据,对于网站的访问和带宽是巨大的挑战,对于高并发和大访问访问量的站点来说,需要使用AJAX相关的技术来实现...
  • [Python爬虫]爬虫实例:三种方式爬取PEXELS图片 在爬取PEXELS时,遇到了这样问题: 页面使用Ajax的异步加载技术来实现分页,所以通过request.text无法获取动态加载的内容.而如果想正确获取这些数据,则需要使用名为逆向...
  • python课最后的实验报告是要爬取一个异步加载网页的数据,然后,很多人就懵了,点下一页,URL不变。对从豆瓣 top250 开始学爬虫的小白及其不友好,骂骂咧咧的打开B站,这代码真白,呸,这代码真妙。   &...
  • 判断异步加载方式(常用的JS库) 1. jQuery(70%) # 搜索 jquery 茅塞顿开 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script src="/Scripts/jquery-...
  • 一、什么是异步加载的网页? 1、有些网页不分页,往下只管拉,就会加载新的内容。 2、有些网页 点击下面加载更多就会一直加载。 3、有些网页读取代码后发现网页代码只有框架,没有内容。 4、有些内容虽然有页码...
  • 最近由于学习内容的要求,需要从网页上抓取一些数据来做分析报告,在看了python爬虫的一些基础知识之后就直接上手去网站上爬数据了。作为新手踩坑是无法避免,最近就遇到了一个比较难的问题: 一般情况下,要抓去...
  • Python爬虫——获取ajax异步加载数据

    千次阅读 2019-12-19 17:05:51
    在我们访问网页的时候,经常会看到一种技术,当我们点击了一个选项卡或者其他的链接,网页数据发生了改变,但是网址却没有发生任何变化,那么这种技术就是ajax异步加载数据,当我们点击一个链接的时候,它只是发送了...
  • 异步加载一.特殊的异步加载二.多次请求的异步加载 一.特殊的异步加载 有一些网页,显示在页面上的内容要经过多次异步请求才能得到。第1个AJAX请求返回的是第2个请求的参数,第2个请求的返回内容又是第3个请求的参数...
  • 以360图片站为例: ...爬取其壁纸频道,前9页,共270张...360图片网站爬虫 网站图片爬取 """ import requests from urllib.parse import urlencode #把字典转化为url参数 ''' 链接分析: https://image.so.com/zj...
  • 同步加载、异步加载、延迟加载 爬取的网站链接 KnewOne 需要下载代码的可以到我的GitHub上下载  https://github.com/FightingBob/-Web-Crawler-training  如果觉得可以,请给我颗star鼓励一下,谢谢! ...
  • 一个用于爬取采用JS脚本防爬虫漫画网站的脚本 具体看注释 # coding=utf-8 import pdfkit import requests from urllib.request import urlretrieve from bs4 import BeautifulSoup import os,time,threading from ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 381
精华内容 152
关键字:

python爬虫异步加载

python 订阅
爬虫 订阅