精华内容
下载资源
问答
  • 对了 昨天爬了boss今天打开那个网页需要验证一下才能正常使用,爬虫频繁访问人家的网站确实会对人家的服务器造成很大的压力。 直接上源码: #coding=utf-8 import re,requests,json import time from lxml import ...

    本文章的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,滥用技术产生的风险与本人无关。
    本文章是自己学习的一些记录。

    分页爬取Boss招聘信息

    上一篇博客是进行了单页的爬取,这一篇博客进行分页爬取
    对了 昨天爬了boss今天打开那个网页需要验证一下才能正常使用,爬虫频繁访问人家的网站确实会对人家的服务器造成很大的压力。

    直接上源码:

    #coding=utf-8
    import re,requests,json
    import time
    from lxml import etree
    #页面请求函数
    def get_page(url):
        #定义请求头
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
            'cookie':'__zp__pub__=; __c=1594858288; __g=-; Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1594802566,1594802579,1594804509,1594858288; lastCity=100010000; __l=l=%2Fwww.zhipin.com%2F&r=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DQQT0PZQBIVcpwWTeZGMmOwV5nQUWVTgFd7EM1L42SmqzJhjC9klUxgc9l2LHGTXa%26wd%3D%26eqid%3De3bb42570052c852000000035f0f9b29&friend_source=0&friend_source=0; __a=41908954.1594802565.1594802579.1594858288.21.3.5.21; Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1594858520; __zp_stoken__=e5e0aWGo3cmlTcy4sL0UcdSx7Ri8mMGhwMRYXOTRDZyB1IGpIJWQZcCkUDnw8LhE0GiA6QDokCSA6V3sVPjgZKxJpAnQNazQ3eBVebBkkNXVORwkARV0sJU50BUMCWUd%2FWBl%2FPzVffFhyTXo%3D; __zp_sseed__=7fK5T//qwfcgyvpIKVkQSe3LryZBDEUQ3/HO+nDeYaY=; __zp_sname__=e351c092; __zp_sts__=1594858959299'
        }
        #请求指定的url,返回请求的页面
        # 发送请求
        res = requests.get(url=url, headers=headers)
        # 判断请求是否成功
        if res.status_code == 200:
            response=res.content.decode('utf-8')
            return  response
        else:
            return False
    
    #解析页面html数据
    def parse_html(html):
        try:
            html=etree.HTML(html)
            job_data = html.xpath('//div[@class="job-title"]//a/text()')
            city_data = html.xpath('//span[@class="job-area-wrapper"]//span/text()')
            company_data = html.xpath('//div[@class="company-text"]//h3//a[1]/text()')
            company_type_data = html.xpath('//div[@class="company-text"]//p//a[1]/text()')
            data = list(zip(job_data, city_data, company_data, company_type_data))
            print(data)
            return data
        except:
            return False
    
    def main(num):
        #拼接url
        url=f'https://www.zhipin.com/c100010000/?page={num}&ka=page-{num}'#使用f可以直接在字符串中拼接变量
        #调用请求页面的程序
        html=get_page(url)
        if html:
            #调用解析的方法函数
            alist=parse_html(html)
            with open("./morenewbossdata.json",'a+') as f:
                for i in alist:
                    f.write(json.dumps(i)+'\n')
                    
    if __name__=="__main__": 
        for i in range(1,11):
            print(f'当前正在爬取第{i}页') #f拼接
            main(i)
            time.sleep(2)
    

    说一下思路,先进行导包,本文还是使用xpath进行数据解析
    首先写主函数main(),写入url 使用f可以直接在字符串中拼接变量(这是在那个学习爬虫的视频中老师教的一种方法)

    然后调用页面请求函数get_page()传入参数url,在get_page这个函数中,定义好请求头,也就是上篇博客写的那样的操作,发送请求和验证请求是否成功 传入参数num 也就是我们想要爬取多页的一个参数

    请求完成后,调用解析函数parse_html()成功后将数据写入json文件中。

    最后写入
    if name==“main”:
    for i in range(1,11):
    print(f’当前正在爬取第{i}页’) #f拼接
    main(i)
    time.sleep(2)

    爬取1-11页的数据共10页,调用主函数
    json数据格式的处理还是上篇博客的处理方法,暂时我还没有学习到一种直接就能将中文写进的方法(还得继续学习)
    在这里插入图片描述
    按照箭头的提示去操作;

    转换成功后的数据:
    在这里插入图片描述
    每页30条数据,这里出了一个问题就是,爬到4页后面就爬不出来了
    不知道什么原因(还得查询解决,大佬有知道的可以在评论区指点一下,感激不尽)
    所以最终爬取了4页 一共120条数据

    继续学习 欢迎大佬们指点

    展开全文
  • python爬虫 分页获取图片并下载

    千次阅读 2015-08-14 14:17:49
    python网页爬虫,抓取所需要的图片,并下载下来,可以分页抓取## 刚接触python2天,想快速上手,就写了个爬虫,写完之后,成就感暴增,用起来顺手多了
    --刚接触python2天,想快速上手,就写了个爬虫,写完之后,成就感暴增,用起来顺手多了。奋斗
    

    1.源码

    #coding=utf-8
    import urllib
    import re
    class Page():
    	__slots__ = ('url', 'regex', 'arg' )
    	def __init__(this ,url ,regex ,arg ):
    		if not arg : 
    			arg['download'] = False
    			arg['write'] = False
    			arg['outpath'] = ''
    		this.filter = Filter(url,{
    			'regex' : regex,
    			'custom' : arg['custom'] if arg.has_key('custom') else ''
    		})
    		this.url = url;
    		this.outpath = arg['outpath'] if arg.has_key('outpath') else ''
    		this.download =arg['download'] if arg.has_key('download') else False
    		this.write = arg['write'] if arg.has_key('write') else False
    		this.pagin = arg['pagin'] if arg.has_key('pagin') else False
    
    	def start(this ,*prefix):
    		_pagin = this.pagin; _getHtml = this.getHtml;_prefix = '1';
    		if len(prefix) >= 1 : _prefix = prefix[0];
    		_getHtml(this.url ,_prefix);
    		if _pagin != False : 
    			_start = _pagin['start']; _end = _pagin['end']; _rule = _pagin['rule'];
    			while _start <= _end :
    				_getHtml(_rule.replace('{page}',str(_start)) ,str(_start));
    				_start += 1
    
    	def down(this ,url ,prefix):
    		try:
    			filename = str(prefix) + '_' + url[url.rfind("/")+1:]
    			urllib.urlretrieve(url, this.outpath + filename);
    			print 'download-succeed\t->',filename
    		except:
    			print 'download->failed'
    
    	def downs(this ,arr ,prefix):
    		for x in arr: this.down(x ,prefix);
    
    	def writeFile(this ,arr):
    		_file = open(this.outpath + 'list.txt', 'a+')
    		try:
    			_file.writelines('\n\n'+'\n'.join(arr))
    		finally:
    			_file.close()
    
    	def getHtml(this ,url ,prefix):
    		try:
    			_p = urllib.urlopen(url); html = _p.read(); _p.close()
    			html = unicode(html, "gb2312").encode("utf8")
    			arr = this.filter.execute(html ,prefix)
    			if this.download == True : this.downs(arr ,prefix);
    			if this.write == True : this.writeFile(arr);
    		except:
    			print "catch finally exception." 
    
    class Filter():
    	def __init__(this ,url ,arg):
    		this.arg = arg
    		this.url = url
    
    	def _getDomain(this):
    		url = this.url.split('/')
    		return url[0]+'//'+url[2]
    
    	def _getRealUrl(this ,domain, url):
    		if url[0] == '/' : return  domain + url;
    		if 'http://' in url : return url 
    		#==============需要处理的字符串链接... 
    		return domain + '/' +url;
    
    	def execute(this ,html ,prefix):
    		_arg = this.arg; arr=[]; getRealUrl = this._getRealUrl;
    		its = re.finditer( _arg['regex'] ,html)
    		for match in its: arr.append(getRealUrl(this._getDomain() ,match.groups()[0]))
    		if _arg.has_key('custom') == True and _arg['custom'] != '' : _arg['custom'](arr ,prefix);
    		return arr
    
    def paginList(arr ,prefix):
    	num = 1;
    	for x in arr:
    		Page(x ,'<p><img\ssrc="(.*?)"\salt.*?</p>' ,{
    			'download' : True,
    			'outpath' : 'f:/temp/'
    		}).start(prefix+'_'+str(num));
    		num+=1
    
    Page("http://www.netbian.com/fengjing/" ,'<li><a\shref="(.*?)"\s.*?\salt="(.*?)"\s.*?</li>' ,{
    	'custom' : paginList,
    	'pagin' : {
    		'start' : 2,
    		'end' : 10,
    		'rule' : 'http://www.netbian.com/fengjing/index_{page}.htm'
    	}
    }).start()


    2.运行如下

    $ python getjpg.py
    download-succeed        -> 1_1_1bdbc1d1628a1f0ebd5fc60055ee506e.jpg
    download-succeed        -> 1_2_01b5b45171979aace617ab79299d7515.jpg
    download-succeed        -> 1_3_5698c42371add40501a328ef2c753b4d.jpg
    download-succeed        -> 1_4_f7219087ce29c474a777867b8e4755ed.jpg
    download-succeed        -> 1_5_58bf8172ea8bbc4cee0a0f8240f2b289.jpg
    download-succeed        -> 1_6_b4700f4bd96f90039ed662ebbf6c1f7c.jpg
    download-succeed        -> 1_7_8a637b3362acddac4671d9ad02e4a93f.jpg
    download-succeed        -> 1_8_f28e22908b68d6fbe42a15c4fcd62613.jpg
    download-succeed        -> 1_9_03806c0b3d33cfc3a3eb4ea3bbe8ca9e.jpg
    download-succeed        -> 1_10_cf26fb246e9b57c06e328af94e60450b.jpg
    download-succeed        -> 1_11_7563610f39bd29b8381201b95eed2624.jpg
    download-succeed        -> 1_12_8ccaccede13d0f377d0d8822243f3b6a.jpg
    download-succeed        -> 1_13_c95a0207db67a334be4812cec25d7023.jpg
    download-succeed        -> 1_14_71ce070aef91660e8dad60a5919ec505.jpg
    download-succeed        -> 1_15_9a647a8f449cdb3208a561b4c9fe2ce6.jpg
    download-succeed        -> 1_16_45d9992e3d5080cf14ef73da14066283.jpg
    download-succeed        -> 1_17_7bd84ee7d6f5cb911a3b1dbc6e0775c4.jpg
    download-succeed        -> 1_18_8397b9d434a187444c389ebff48bcfb5.jpg
    download-succeed        -> 2_1_f14e658f2464769756039e1ff18d5693.jpg
    download-succeed        -> 2_2_ad051a669008969800ccd324de056465.jpg
    download-succeed        -> 2_3_6190ffe369199b95274100996b02359a.jpg
    download-succeed        -> 2_4_f14dce28d960941781a12a57123076df.jpg
    download-succeed        -> 2_5_c7fb3b6f700339e9f3c9ee02474211eb.jpg
    download-succeed        -> 2_6_327f1a33b8c5989a2d014ea41565caef.jpg

    ...


    3.结果如下


    展开全文
  • Python爬虫 - 专栏链接 手把手教你如何入门,如何进阶。 目录 1. 分页爬虫 2. 反爬虫 2.1 判别身份 2.2 IP 限制 练习题 联系我们,一起学Python吧 1. 分页爬虫 分页爬虫指的是针对网站数据存在上一页 ...

    Python爬虫 - 专栏链接

    手把手教你如何入门,如何进阶。

    目录

    1.  分页爬虫

    2.  反爬虫

    2.1 判别身份

    2.2 IP 限制

    练习题

    联系我们,一起学Python吧


    1.  分页爬虫

    分页爬虫指的是针对网站数据存在上一页 下一页 翻页情况。

    为了分页爬取整个网站,我们得先分析该网站的数据是如何加载的。

    还是以豆瓣读书为例,当我们点击第二页后,观察浏览器的地址栏,发现网址变了。网址变成了 https://book.douban.com/top250?start=25,和原来相比后面多了一个 ?start=25

    这部分被称为 查询字符串,查询字符串作为用于搜索的参数或处理的数据传送给服务器处理,格式是 ?key1=value1&key2=value2

    ? 前面是网页的地址,后面是查询字符串。以键值对 key=value 的形式赋值,多个键值对之间用 & 连接在一起。例如 ?a=1&b=2 表示:a 的值为 1,b 的值为 2。

    查询字符串用于信息的传递,服务器通过它就能知道你想要什么,从而给你返回对应的内容。比如你在知乎搜索 python,网址会变成 https://www.zhihu.com/search?type=content&q=python,后面的查询字符串告诉服务器你想要的是有关 python 的内容,于是服务器便将有关 python 的内容返回给你了。

    第二页 start=25,第三页 start=50,第十页 start=225,而每页的书籍数量是 25。你有没有发现其中的规律?

    因为每页展示 25 本书,根据规律其实不难推测出 start 参数表示从第几本书开始展示,所以第一页 start 是 0,第二页 start 是 25,第三页 start 是 50,第十页 start 是 225。因此 start 的计算公式为 start = 25 * (页码数 - 1)(25 为每页展示的数量)。我们来通过代码自动生成豆瓣图书 Top250 所有数据(10 页)的地址:

    url = 'https://book.douban.com/top250?start={}'
    # num 从 0 开始因此不用再 -1
    for num in range(10):
        urls = url.format(num*25)
        print(urls)
    #   'https://book.douban.com/top250?start=0',
    #   'https://book.douban.com/top250?start=25',
    #   'https://book.douban.com/top250?start=50',
    #   'https://book.douban.com/top250?start=75',
    #   'https://book.douban.com/top250?start=100',
    #   'https://book.douban.com/top250?start=125',
    #   'https://book.douban.com/top250?start=150',
    #   'https://book.douban.com/top250?start=175',
    #   'https://book.douban.com/top250?start=200',
    #   'https://book.douban.com/top250?start=225'

    有了所有网页的链接后,我们就可以爬取整个网站的数据了!我们来改进一下上一关中爬取豆瓣读书的代码:

    import requests
    import time
    from bs4 import BeautifulSoup
    
    # 将获取豆瓣读书数据的代码封装成函数
    def get_douban_books(url):
        headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0'
        }
        res = requests.get(url, headers=headers)
        soup = BeautifulSoup(res.text, 'html.parser')
        items = soup.find_all('div', class_='pl2')
        for i in items:
            tag = i.find('a')
            name = tag['title']
            link = tag['href']
            print(name, link)
    
    url = 'https://book.douban.com/top250?start={}'
    for num in range(10):
        urls = url.format(num*25)
        get_douban_books(urls)
        # 暂停 1 秒防止访问太快被封
        time.sleep(1)
    # 提示:最后的 time.sleep(1) 是防止访问太快被对方服务器封禁,封禁后会导致一段时间内无法再次访问该网站。

    虽然豆瓣图书的数据有 10 页,但每页数据的格式一样,因此爬取方式和爬虫代码也是一样的。所以,我将获取豆瓣读书数据的爬虫代码封装成函数,唯一会变的网页地址作为参数。再用 for 循环遍历所有的网页地址,依次传入封装好的 get_douban_books() 函数,这样即可实现整个网站的爬取了。

     

    2.  反爬虫

    上一节的代码最后,我们用了 time.sleep(1) 来减缓我们爬虫的爬取速度。你可能会问:爬虫不是越快越好吗?这样我们就能高效地获取大量数据了。

    没错,这对我们来说是方便了,但网站的目的是给正常用户用浏览器访问的。如果我们过于频繁的爬取数据,很可能使网站服务器过载瘫痪,所以也就有了 反爬虫 措施。

    反爬虫 是网站限制爬虫的一种策略。它并不是禁止爬虫(完全禁止爬虫几乎不可能,也可能误伤正常用户),而是限制爬虫,让爬虫在网站可接受的范围内爬取数据,不至于导致网站瘫痪无法运行。

    常见的反爬虫方式有 判别身份IP 限制 两种,我们一一介绍,并给出相应的反反爬虫技巧。

     

    2.1 判别身份

    有些网站在识别出爬虫后,会拒绝爬虫的访问,比如豆瓣。我们以豆瓣图书 Top250 为例,用浏览器打开是下面这样的:

    如果用爬虫直接爬取它,我们看看结果会是什么:

    import requests
    res = requests.get('https://book.douban.com/top250')
    print(res.text)

    输出结果为空,什么都没有。这是因为豆瓣将我们的爬虫识别了出来并拒绝提供内容。

    其实,不管是浏览器还是爬虫,访问网站时都会带上一些信息用于身份识别。而这些信息都被存储在一个叫 请求头(request headers)的地方。

    服务器会通过请求头里的信息来判别访问者的身份。请求头里的字段有很多,我们暂时只需了解 user-agent(用户代理)即可。user-agent 里包含了操作系统、浏览器类型、版本等信息,通过修改它我们就能成功地伪装成浏览器。

    默认的 user-agent 和在头上贴着“我是爬虫”的纸条没有什么区别,难怪会被服务器识别出来。因此我们需要修改请求头里的 user-agent 字段内容,将爬虫伪装成浏览器。所以接下来我们来看看如何在 requests 库中修改请求头。

    我们打开 requests 的官方文档(http://cn.python-requests.org/zh_CN/latest/)并搜索 定制请求头,找到对应的文档:

    import requests
    headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0'
    }
    res = requests.get('https://book.douban.com/top250',headers=headers)
    print(res.text)

    这样就能搞定获取到数据咯。

    除了 user-agent 之外的其他请求头字段也能以同样的方式添加进去,但大部分情况下我们只需要添加 user-agent 字段即可(有些甚至不需要)。当我们加了 user-agent 字段还是无法获取到数据时,说明该网站还通过别的信息来验证身份,我们可以将请求头里的字段都添加进去试试。

    如果你访问过于频繁,即使改了 user-agent 伪装成浏览器了,也还是会被识别为爬虫,并限制你的 IP 访问该网站。

    我们常常使用 time.sleep() 来降低访问的频率,这样,对网站服务器的压力不会太大,访问的低频率对方也就不理会我们的爬虫。虽然速度较慢,但也能获取到我们想要的数据了。

    判别身份是最简单的一种反爬虫方式,我们也能通过一行代码,将爬虫伪装成浏览器轻易地绕过这个限制。所以,大部分网站还会进行 IP 限制 防止过于频繁的访问。

     

    2.2 IP 限制

    IP(Internet Protocol)全称互联网协议地址,意思是分配给用户上网使用的网际协议的设备的数字标签。你可以将 IP 地址理解为门牌号,我只要知道你家的门牌号就能找到你家。

    我们打开官方文档,看看如何使用代理:

    headers 一样,也是定义一个字典,但传递给的是 proxies 参数。我们需要将 httphttps 这两种协议作为键,对应的 IP 代理作为值,最后将整个字典作为 proxies 参数传递给 requests.get() 方法即可。IP 代理有免费的和收费的,你可以自行在网上寻找。

    分享一个自动获取免费IP的源代码,仅供参考:(原理是抓取页面免费的IP加以在百度测试)

    # /usr/bin/env python
    # -*- coding:utf-8 -*-
    import requests
    from bs4 import BeautifulSoup
    import random
    
    ip_list = []
    
    def get_ip_list(url):
        headers = {'User-Agent': 'Mozilla/5.0'}
        res = requests.get(url, headers=headers)
        bs = BeautifulSoup(res.text, 'html.parser')
        results = bs.select('#ip_list tr')
        for result in results[1:]:
            ip = result.select('td')[1].text
            port = result.select('td')[2].text
            judge(ip, port)
    
    def judge(ip, port):
        proxy = {'http': ip+':'+port}
        print('-' * 45)
        print('正在测试 %s ' % proxy)
        try:
            print('-' * 45)
            res = requests.get('https://www.baidu.com', proxies=proxy)
            print('恭喜!%s:%s 测试通过!' % (ip, port))
        except Exception:
            print('IP:' + ip + '无效!')
            return False
        else:
            if 200 <= res.status_code < 300:
                ip_list.append((ip, port))
                return True
            else:
                print('IP:' + ip + '无效!')
                return False
    
    def get_random_ip():
        ip, port = random.choice(ip_list)
        result = judge(ip, port)
        if result:
            return ip + ':' + port
        else:
            ip_list.remove((ip, port))
    
    if __name__ == '__main__':
        get_ip_list('https://www.xicidaili.com/wt/')
        print('-' * 45)
        for IP in ip_list: print(':'.join(IP))
        print('-' * 35)
        print('通过测试的 IP 总数:', len(ip_list))
    print('-' * 35)
    
    # ...
    # 14.115.107.232:808
    # 58.253.158.177:9999
    # 112.84.73.53:9999
    # 221.237.37.137:8118
    # -----------------------------------
    # 通过测试的 IP 总数: 100
    #-----------------------------------
    

    官方文档中给了代理的基本用法,但在爬取大量数据时我们需要很多的 IP 用于切换。因此,我们需要建立一个 IP 代理池(列表),每次从中随机选择一个传给 proxies 参数。我们来看一下如何实现:

    import requests
    import time,random
    from bs4 import BeautifulSoup
    
    # 将获取豆瓣读书数据的代码封装成函数
    def get_douban_books(url,proxies):
        headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0'
        }
        res = requests.get(url, headers=headers,proxies=proxies)
        soup = BeautifulSoup(res.text, 'html.parser')
        items = soup.find_all('div', class_='pl2')
        for i in items:
            tag = i.find('a')
            name = tag['title']
            link = tag['href']
            print(name, link)
    
    url = 'https://book.douban.com/top250?start={}'
    # IP 代理池(瞎写的并没有用)
    proxies_list = [
      {
        "http": "http://221.237.37.137:8118",
        "https": "http://112.84.73.53:9999",
      },
      {
        "http": "http://58.253.158.177:9999",
        "https": "http://14.115.107.232:808",
      },
      {
        "http": "http://163.125.71.198:9999",
        "https": "http://119.84.84.185:12345",
      }
    ]
    
    for num in range(10):
        urls = url.format(num*25)
        # 从 IP 代理池中随机选择一个
        proxies = random.choice(proxies_list)
        get_douban_books(urls, proxies)
        # 暂停 1 秒防止访问太快被封
        time.sleep(1)

    这样,我们就能既快速又不会被限制地爬取数据了。但毫无节制的爬虫已经和网络攻击没什么区别了,严重的甚至会导致网站瘫痪。恶意地大量访问别人的网站,消耗服务器资源是非常不道德、甚至违法的。

    其实,除了反爬虫措施远不只这两种。比如验证码,当你的操作异常时网站经常会弹出验证码。验证码技术也在不断地升级,从原先简单的随机生成的数字字母,演变成随机汉字,再由按顺序点击图中对应的汉字演变成滑块拼图。

    验证码的形式千千万万,破解起来也较为困难。我们本关不会涉及,等你入门爬虫后,再去专门攻克验证码也不迟。

     

     

    练习题

    同学们,先自觉练习,答案在公众号,公众号回复暗号【答案】即可。

    1. 网站反爬虫时一般通过请求头里的什么字段来判别访问者的身份?

    A.user-agent
    B.content-type
    C.cache-control
    D.Access-Control-Allow-Origin

    2. 我们通过 requests.get() 的哪个参数可以定制请求头?

    A.params
    B.proxies
    C.cookies
    D.headers

    3. 反反爬虫的策略不包含下列哪项?

    A.添加headers信息。
    B.更换爬虫IP。
    C.设置延迟爬虫sleep()。
    D.反爬虫自己会好的。

    4. 我们以豆瓣图书 Top250 为例学会了爬取整个网站。接下来请你依葫芦画瓢,试着爬取豆瓣电影 Top250 的所有数据吧!豆瓣电影 Top250 的地址是:https://movie.douban.com/top250。

     

    联系我们,一起学Python吧

     

    每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。


    ​微信群(关注「Python家庭」一起轻松学Python吧)

    ​QQ 群(983031854

    展开全文
  • 1、最近刚开始学习python 写了个爬虫练习,感觉主要是得会用F12查询网站结构代码。还涉及到反爬虫,每个网站都不一样,拿到的解析出的json数据格式也不同。得有些Web知识的基础才行。 ... 2、上代码 ...

    1、最近刚开始学习python   写了个爬虫练习,感觉主要是得会用F12查询网站结构代码。还涉及到反爬虫,每个网站都不一样,拿到的解析出的json数据格式也不同。得有些Web知识的基础才行。

    https://www.bilibili.com/video/av54287470/  视频讲解

    2、上代码

    import urllib.request
    import time
    # xpath  lxml第三方包   将html转化为树形结构
    from lxml import etree
    # re系统包  正则
    import re
    
    """
    爬取数据方式:                     1、通过网页源代码(数据绑定在html标签中)
    根据目标网址绑定数据的方式决定      2、通过接口获取json(json绑定)
    
    京东商品信息    获取目标url(开发者模式)    获取网页源代码抓取数据
                                                搜索页面、商品子页面{获取搜索页面的所有商品 class="gl-i-wrap",所有商品的子页面【二次爬取】}
                    发送url获取响应数据   反爬    
                    进行数据处理
    """
    # 分页抓取手机商品信息
    def jdPhone_spider(url,beginPage,endPage):
        for page in range(beginPage,endPage+1):
            #京东页码奇数递增处理  反爬
            pn = page*2 -1
            print("正在抓取第"+str(page)+"页")
            fullurl = url+"&page="+str(pn)#构建带页码的url
            # 防止被封
            time.sleep(2)
            #读取页面
            load_page(fullurl)
    # 读取查询页面
    def load_page(url):
        #定义请求头
        headers = {
            "user_agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
        }
        # 给请求添加请求头
        request = urllib.request.Request(url,headers=headers)
        html = urllib.request.urlopen(request).read()
        content = etree.HTML(html)  #转化为tree  使用xpth进行匹配(标签匹配  跟正则挺像)
        # print(content)
        #获取商品的详情页面  div下的@代表属性
        content_list = content.xpath('//div[@class="gl-i-wrap"]/div[@class="p-img"]/a/@href')
        # print(content_list)
        #url统一处理
        for i in range(1,31):
            # 异常处理,防止页码越界
            try:
                # ""前加r代表字符串(原始字符串)  正则截取数据   根据:截取
                result = re.split(r":",content_list[i-1])[1]
                content_list[i-1] = result
            except Exception as e:
                continue
        # print(content_list)
        # j是所有的商品详情页面
        for j in content_list:
            # print(j)
            new_url = "http:"+j #拿到完整url   接下来读取子页面信息
            load_link_page(new_url,headers)
    
    # 读取商品详情子页面的信息
    def load_link_page(url,headers):
        request = urllib.request.Request(url, headers=headers)
        html = urllib.request.urlopen(request).read()
        content = etree.HTML(html)  # 转化为tree  使用xpth进行匹配(标签)
        #获取手机的品牌
        brand = content.xpath('//div[@class="p-parameter"]/ul[@id="parameter-brand"]/li/@title')
        print(brand)
    
    
    if __name__ == '__main__':
        beginPage = int(input("请输入起始页:"))
        endPage = int(input("请输入结束页:"))
        # 目标url  手机变成unicode编码%E6%89%8B%E6%9C%BA
        url = "https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8"
        jdPhone_spider(url,beginPage,endPage)

    3、部分结果

    展开全文
  • Python爬虫:如何爬取分页数据?

    千次阅读 2017-05-24 12:56:00
    上一篇文章《Python爬虫:爬取人人都是产品经理的数据》中说了爬取单页数据的方法,这篇文章详细解释如何爬取多页数据。 爬取对象: 有融网理财项目列表页【履约中】状态下的前10页数据,地址:...
  • 废话不多说,今天给大家分享三个极实用的Python爬虫案例。1、爬取网站美图爬取图片是最常见的爬虫入门项目,不复杂却能很好地熟悉Python语法、掌握爬虫思路。当然有两个点要注意:不要侵犯版权,要注意营养。思路...
  • Python 爬虫抓取图片(分页)

    千次阅读 2017-09-04 00:36:21
    import urllib import re error_count = 0 down_path = r'C:\liujwFiles\NON_IBM_Files\PycharmProjects\pa_chong_files' for page in range(1, 11): # page 1--10 #The pages after the first page(2--10)
  • python爬虫日记01

    千次阅读 多人点赞 2021-05-09 13:58:33
    PYTHON爬虫日记01 记录自己的学习爬虫日记 选用python作为编程语言 1.环境准备 python3.6+ mysql pycharm 2.思路 以爬取猫眼top100为目标 ​ 1.分析url的规律 ​ https://maoyan.com/board/4?offset=10 发现他们的...
  • 下图是最终的结果:下面进入正题:一、采集源分析:首先我们找到豆瓣的编程类书籍网址:进入网址之后我们翻到最下面的分页导航:通过分析分页地址我们可以得出:这个地址则是我们要采集的内容。第一页 start = 0,第...
  • python爬虫实战教程

    2020-06-07 20:22:41
    Python爬虫学习 前言 本次python爬虫系列主要以代码的方式入门基础爬虫系列,对部分知识理论解释不多,读者会用即可,特点注意本博客是以实战为基础一定要看代码,讲解主要分。以下7个模块进行。 1、requests库 2、...
  • Python3爬虫 处理分页

    千次阅读 2017-07-26 17:13:07
    import logging import random import threading import urllib.parse import urllib.parse import urllib.request from queue import Queue import pymysql from bs4 import BeautifulSoup import time ...
  • #import requests import urllib import re #res = requests.get('https://www.douban.com/') #res = urllib.urlopen('https://www.douban.com').read() #web url 1 res = urllib.urlopen('https://www.douban.c
  • python爬虫-爬取链家(带分页)

    千次阅读 2019-05-24 16:57:58
    node.js爬虫-爬取链家(带分页) 上代码: # coding : UTF-8 import requests import csv import random import time import socket import http.client from bs4 import BeautifulSoup import re def get_...
  • 首先创建项目 进入项目文件夹下用cmd scrapy startproject dytt 打开项目创建app ...scrapy genspider dy dytt8.net ...USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0;... x64) AppleWebKit/537.36 (KHTML, like Gec...
  • python爬虫

    2016-12-04 18:21:26
    # -*- coding: utf-8 -*- ...#操作:输入带分页的地址,去掉最后面的数字,设置一下起始页数和终点页数。 #功能:下载对应页码内的所有页面并存储为html文件 #--------------------------------------- import s
  • #使用通用爬虫对url对应的页面整张爬取 page_text = requests.get(url=new_url,headers=headers).text #使用聚焦爬虫进行解析 ex = '<li>.*?*?src="(.*?)".*?</li>' img_src_list= re.findall(ex,page_text,re....
  • python爬虫学习

    千次阅读 2020-04-13 15:56:22
    文章目录一、爬虫的分类二、爬虫的准备工作三、http协议四、requests模块1、使用步骤2、requests get方法response对象例子1:获取百度产品页面例子2:获取新浪新闻页面分页如何实现?例子3:爬取贴吧中前十页的内容...
  • Python爬虫入门2

    2019-07-02 16:39:39
    Python爬虫入门2一、Requests获取豆瓣电影信息1. 分析2. 实现二、Selenium 一、Requests获取豆瓣电影信息 1. 分析 请求URL - https://movie.douban.com/top250 请求方式 - GET 请求头 - User-Agent - Cookies 分页...
  • python爬虫,爬取扇贝当日单词,cookie登录, 分页爬取当日的单词,保存到excel
  • python爬虫之ajax请求

    2018-08-09 08:06:41
    python爬虫之ajax请求 爬取豆瓣网的分页浏览get请求: import urllib.request import urllib.parse url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&...
  • Python 爬虫学习1

    2019-10-02 01:38:56
    一个简单的百度贴吧爬虫程序: 代码: # -*- coding: utf-8 -*- #---------------------...# 操作:输入带分页的地址,去掉最后面的数字,设置一下起始页数和终点页数。 # 功能:下载对应页码内的所有页面并...
  • Python 爬虫 上篇

    2018-01-14 14:09:09
    Python安装 python学习 一 python语法,及变量类型 ... 二 03 爬一个图片网站-获得所有分页网址 python学习 二 04 爬一个图片网站-解析文件,获得所有图片链接 python学习 二 05 爬一个图片网站-下载图片
  • Python 爬虫 下篇

    2018-01-14 14:10:57
    Python安装 python学习 一 python语法,及变量类型 ... 二 03 爬一个图片网站-获得所有分页网址 python学习 二 04 爬一个图片网站-解析文件,获得所有图片链接 python学习 二 05 爬一个图片网站-下载图片
  • 需要获取最大页数 分析 最后一个li标签 最后一个li标签 写求取最大页码的代码 def get_max_page(self,html): tree = etree.HTML(html) pages = tree.xpath('//ol[@class=&... i...
  • 爬虫的时候,我们会遇到一些问题,即使获取到全文的url,但是可能page的连接获取不完整,就会导致我们爬虫的时候,比如说爬商品信息,就会拿不完整...实现语言:ruby or python(提供两种) 爬虫工具:selenium ...
  • 分享一则对于网抓中面对post请求访问的页面或者在分页过程中需要post请求才可以访问的内容! 面的post请求的网址是不可以零参访问网址的,所以我们在网抓的过程中需要给请求传表单数据,下面看一下网页中post请求...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 360
精华内容 144
关键字:

python爬虫分页

python 订阅
爬虫 订阅