精华内容
下载资源
问答
  • python爬虫

    万次阅读 2018-02-07 00:59:16
    #通用网络爬虫(没有目的,去所有的URL) 聚焦网络爬虫(过滤无关的链接)#python数据分析与挖掘实战的正则表达式 #正则表达式 世界上信息非常多,而我们关注的信息有限。假如我们希望只提取关注数据,此时可以...

    一、正则表达式

    #python网络爬虫
    #通用网络爬虫(没有目的,爬去所有的URL)  聚焦网络爬虫(过滤无关的链接)
    
    #python数据分析与挖掘实战的正则表达式
    #正则表达式  世界上信息非常多,而我们关注的信息有限。假如我们希望只提取出关注数据,此时可以通过一些表达式进行提取,正则表达式就是其中一种进行数据筛选的表达式。
    
    #原子
    #原子是正则表达式中最基本的组成单位,每个正则表达式中至少要包含一个原子。
    #常见的原子类型有:普通字符作为原子,非打印字符作为原子,通用字符作为原子,原子表
    
    import re
    pat="yue"         #普通字符作为原子
    string="http://yum.iqianyue.com"
    rst=re.search(pat,string)
    print(rst)
    
    pat1="\n"  #\n  \t            #非打印字符作为原子
    string1='''dsfjsdjf
    sdfsdfsdfsdf'''
    rst1=re.search(pat1,string1)
    print(rst1)
    
    pat2="\w\dpython\w"
    #\w 通用字符,匹配任意字母,数字,下划线
    #\d 匹配任意一个十进制数       #\S 除了十进制数的任意
    #|s 匹配空白字符       #\S 除了空白字符的任意字符
    #\W 匹配任意一个除了字母,数字,下划线的东西
    string2="hsdlfsga7pythonkdfshdskjf"
    rst2=re.search(pat2,string2)
    print(rst2)
    
    pat3="pyth[jsz]n"           #原子表
    展开全文
  • #需要数据的网址 j=0 #!s-p3 for k in range(1,20): url='https://www.duitang.com/search/?kw=%E6%AD%A3%E5%A4%AA&type=feed'+'#!s-p'+str(k) page=requests.Session().get(url) tree=html.fromstring(p.
    import requests
    import urllib
    from lxml import html
    #需要爬数据的网址
    j=0
        #!s-p3
    for k in range(1,20):
        url='https://www.duitang.com/search/?kw=%E6%AD%A3%E5%A4%AA&type=feed'+'#!s-p'+str(k)
        page=requests.Session().get(url)
        tree=html.fromstring(page.text)
        result=tree.xpath('//a[@class="a"]//img/@src') #获取需要的数据
        for i in result:
            urllib.request.urlretrieve(i,'C://Users//FangJZ//Desktop//duitan//'+(str(j))+'.jpg')
            j=j+1
    print('true')

     

    展开全文
  • 全网最全python爬虫精进

    万次阅读 多人点赞 2021-04-25 17:00:23
    4.25(第一天) ...(2)提取数据:我们就可以在拿到的数据中,挑选对我们有用的数据; (3)存储数据:将挑选出来的有用数据保存在某一文件/数据库中。 2-2、爬虫工作原理 (1)获取数据:爬虫程序会根据

    个人公众号 yk 坤帝
    获取更多学习资料

    之前我们讨论了一下请求和响应,接下来几天我们都会讨论对数据的处理。

    接触了爬虫这个领域,大家肯定都听过正则表达式的鼎鼎大名,不过今天我们暂时不谈正则,我们先来讨论一下数据的简单处理,为之后的正则表达式做准备。

    我们用requests.get或requests.post获取到网页的源码,通过BeautifulSoup解析之后,得到的数据还是可能千奇百怪的,可能多了空格,可能有些内容我们不需要等等,所以我们应该对这些数据进行简单的处理。

    首先,来看第一种情况,首尾很多空格的情况,下图是豆瓣电影Top250的图,如果我们想要获取电影上映年份/上映地点/电影类别,实际通过BeautifulSoup解析获取到的数据并不是我们想要的结果。

    在这里插入图片描述

    movie = ''' 1994 / 美国 / 犯罪 剧情 ''' 
    # 我们实际能获取到的数据是这样的,现在我们要去掉首尾多余的空格,可以这么做 movie = movie.strip() 
    # strip()表示去除首尾的空格,这个对字符串的处理用得非常多 
    # 得到的结果就是1994 / 美国 / 犯罪 剧情
    

    经过strip()处理之后,可以看到得到得结果中仍然还是有空格,这个就可以用replace来替 换掉空格。

    个人公众号 yk 坤帝 
    获取更多学习资料
    
    movie = ''' 1994 / 美国 / 犯罪 剧情 '''
    movie = movie.strip() # 
    得到的结果就是1994 / 美国 / 犯罪 剧情 
    movie = movie.replace(' ', '') 
    # 这一行表示将字符串中的空格替换掉,replace第一个参数表示要替换的字符串,第二个 参数表示要用什么来替换。 
    # 得到的结果就是1994/美国/犯罪剧情
    

    经过replace()处理之后,其实得到的数据已经可以了,但是,如果我们想分别提取出上映 年份/上映地点/电影分类呢。

    这个时候就用到我们之前用过的split了。

    movie = ''' 1994 / 美国 / 犯罪 剧情 ''' 
    movie = movie.strip() 
    # 得到得结果就是1994 / 美国 / 犯罪 剧情 movie = movie.replace(' ', '') 
    # 得到的结果就是1994/美国/犯罪剧情 movie = movie.split('/') 
    # 这一行表示将字符串通过/进行分割,得到的是一个列表 
    # 得到的结果是['1994', '美国', '犯罪剧情']
    

    通过strip和replace和split就能得到我们想要的结果了,这三种字符串的处理方法会在处理 数据中经常使用。

    然后我们来看下第二种情况,是关于URL拼接问题的,假设我们现在要爬取知乎首页的超链 接,然后顺着爬取到的超链接一直深入爬下去,这样就能爬取整个知乎了。

    下图是知乎首页其中一个问题的URL,可以发现这个URL并不完整,需要拼接上当前的域名 才能构成一个完整的URL。

    我们当然可以用https://www.zhihu.com和这个URL拼接起来,但是这样又有一个问题,我 们是想要获取到知乎的所有URL,有的URL是带了https://www.zhihu.com的,这样再拼接 一下,就容易出错,所以我们需要预先处理一下。这就需要用到startswith方法了。

    在这里插入图片描述

    个人公众号 yk 坤帝 
    获取更多学习资料
    
    origin_url = 'https://www.zhihu.com' 
    
    url_list = ['/question/36539555/answer/595275293', '/question/308663552/a nswer/577063117', 'https://www.zhihu.com/special/20743868'] 
    
    for i in range(len(url_list)):
    	if not url_list[i].startswith('http'):
    	# 这一行表示如果url_list[i]不是以http开头的话,那么就执行if内部的语句 
    	url_list[i] = origin_url + url_list[i]
    	print(url_list) 
    	 
    	# 得到的最终结果是['https://www.zhihu.com/question/36539555/answer/5952752 93', 'https://www.zhihu.com/question/308663552/answer/577063117', 'https:// www.zhihu.com/special/20743868']
    

    通过startswith提前判断一下,就能够得到我们想要的结果了。当然有startswith,自然而 然会有endswith,同样举个例子来看。

    个人公众号 yk 坤帝 
    获取更多学习资料
    
    url_list = ['https://pic2.zhimg.com/50/v25502c54842dceeb2e8901e884407a7fd_fhd.jpg', 'https://www.zhihu.com/special/20743868']
    
    for url in url_list:
    	if url.endswith('jpg'):
    	
    	# 这一行表示如果url是以jpg结尾的话,就执行if内部的语句
    		url_list.remove(url) 6 print(url_list) 
    		 # 最终结果是['https://www.zhihu.com/special/20743868']
    

    通过startswith和endswith可以用来过滤我们不想要的字符串,并对其进行操作。

    最后,我们再来谈一个join方法,这个方法是用来拼接一个序列(列表/元组等)的值的, 将一个序列转换一个字符串。

    下图是豆瓣中一本书的详情页,每本书都有他的标签,有的时候为了方便存储,我们需要将 这些标签连起来组成一个字符串,我们就可以用join来操作了。

    在这里插入图片描述

    # 上图我们用爬虫去爬取书籍的标签的话,得到的是tag这样的一个列表 
    tag = ['文学', '短篇小说', '小说', '先锋文学'] 
    tag = '-'.join(tag) 
    # 这一行表示用'-'符号将tag这个列表中的每个值连接起来,得到的是一个字符串 
    # 最终结果是'文学-短篇小说-小说-先锋文学'
    

    好了,今天的分享本来就到这里结束了,但还是忍不住要插一个列表的去重,因为真的经常 会用到。

    有这样一个需求,一本书总共有600000个英文单词,保存在了一个列表中,现在想要统计 如果想要阅读这本书,需要多少得词汇量,那么我们面对得问题就是去重。

    我们直接看代码:

    个人公众号 yk 坤帝 
    获取更多学习资料
    
    # 实现功能:将列表中相同的元素去重,统计书籍词汇量 
    
    content = ['Whatever', 'is', 'worth', 'doing', 
    'is', 'worth', 'doing', 'well'] 
    new_content = set(content) 
    # 这一步是将列表转换成集合,就去重成功了,因为集合内的元素是不能重复的,但它是无 序的
    
    new_content = list(new_content) 
    # 这一步是将上一步得到的集合转换成一个列表,这样就得到了最终结果列表了 print(new_content) 
    # 得到的结果是['worth', 'Whatever', 'is', 'doing', 'well']
    
    print(len(new_content)) 
    # 得到的结果是5,说明这本书的词汇量是5个
    

    至此,我们总共讨论了字符串的6种常用方法,分别是strip、replace、split、startswith、 endswith、join,以及列表的去重。 明天我们开始来讨论正则表达式,大家加油。

    个人公众号 yk 坤帝
    获取更多学习资料

    **

    第0关 认识爬虫

    **
    1、初始爬虫
    爬虫,从本质上来说,就是利用程序在网上拿到对我们有价值的数据。
    2、明晰路径
    2-1、浏览器工作原理

    (1)解析数据:当服务器把数据响应给浏览器之后,浏览器并不会直接把数据丢给我们。因为这些数据是用计算机的语言写的,浏览器还要把这些数据翻译成我们能看得懂的内容;
    (2)提取数据:我们就可以在拿到的数据中,挑选出对我们有用的数据;
    (3)存储数据:将挑选出来的有用数据保存在某一文件/数据库中。
    2-2、爬虫工作原理

    (1)获取数据:爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据;
    (2)解析数据:爬虫程序会把服务器返回的数据解析成我们能读懂的格式;
    (3)提取数据:爬虫程序再从中提取出我们需要的数据;
    (4)储存数据:爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。
    3、体验爬虫
    3-1、requests.get()
    ①、安装 requests 库
    Mac电脑里打开终端软件(terminal),输入pip3 install requests,然后点击 enter;
    Windows电脑里叫命令提示符(cmd),输入pip install requests 。
    提示:往后安装其他库时与上方类似,pip install 模块名

    ②、requests 库作用
    requests 库可以帮我们下载网页源代码、文本、图片,甚至是音频。其实,“下载”本质上是向服务器发送请求并得到响应。

    ③、requests 库使用
    选择语言
    res = requests.get(‘URL’)
    requests.get 是在调用requests库中的get()方法,它向服务器发送了一个请求,括号里的参数是你需要的数据所在的网址,然后服务器对请求作出了响应。我们把这个响应返回的结果赋值在变量res上。
    
    3-2、Response对象的常用属性

    ①、response.status_code
    打印 response 的响应状态码,以检查请求是否成功。

    ②、response.content
    把 Response 对象的内容以二进制数据的形式返回,适用于图片、音频、视频的下载。

    ③、response.text
    把 Response 对象的内容以字符串的形式返回,适用于文字、网页源代码的下载。

    ④、response.encoding
    能帮我们定义Response对象的编码。(遇上文本的乱码问题,才考虑用res.encoding)
    3-3、汇总图解
    
    4、爬虫伦理
    4-1、Robots 协议
    Robots 协议是互联网爬虫的一项公认的道德规范,它的全称是“网络爬虫排除标准”(Robots exclusion protocol),这个协议用来告诉爬虫,哪些页面是可以抓取的,哪些不可以。
    4-2、协议查看
    (1)在网站的域名后加上/robots.txt就可以了。如淘宝的robots协议 ( http://www.taobao.com/robots.txt);
    (2)协议里最常出现的英文是Allow和Disallow,Allow代表可以被访问,Disallow代表禁止被访问。
    目录
    1、初始爬虫
    2、明晰路径
    2-1、浏览器工作原理
    2-2、爬虫工作原理
    3、体验爬虫
    3-1、requests.get()
    3-2、Response对象的常用属性
    3-3、汇总图解
    4、爬虫伦理
    4-1、Robots 协议
    4-2、协议查看

    程中我们的示范,会用谷歌浏览器(Chrome)进行演示,强烈推荐你也使用它。
    如果你还没有谷歌浏览器(Chrome),打开下面的链接,就可以下载Chrome的安装包了,Windows和Mac都有:谷歌浏览器(Chrome)安装教程(https://www.google.cn/intl/zh-CN/chrome/)

    初识爬虫
    什么是爬虫?
    到底什么是爬虫呢?
    
    爬虫,从本质上来说,就是利用程序在网上拿到对我们有价值的数据。
    
    爬虫能做很多事,能做商业分析,也能做生活助手,比如:分析北京近两年二手房成交均价是多少?深圳的Python工程师平均薪资是多少?北京哪家餐厅粤菜最好吃?等等。
    
    这是个人利用爬虫所做到的事情,而公司,同样可以利用爬虫来实现巨大的商业价值。比如你所熟悉的搜索引擎——百度和谷歌,它们的核心技术之一也是爬虫,而且是超级爬虫。
    
    以百度为例,你在搜索的时候仔细看,会发现每个搜索结果下面都有一个百度快照。
    

    在这里插入图片描述

    点击百度快照,你会发现网址的开头有baidu这个词,也就是说这个网页属于百度。

    在这里插入图片描述
    这是因为,百度这家公司会源源不断地把千千万万个网站爬取下来,存储在自己的服务器上。你在百度搜索的本质就是在它的服务器上搜索信息,你搜索到的结果是一些超链接,在超链接跳转之后你就可以访问其它网站了。

    爬虫还让这些搜索巨头有机会朝着人工智能的未来迈进,因为人工智能的发展离不开海量的数据。而每天使用这些搜索网站的用户都是数以亿计的,产生的数据自然也是难以计量的。

    从搜索巨头到人工智能巨头,这是一条波澜壮阔的路。而我们应该看到,事情的源头,却是我们今日所书写的“爬虫”。

    我们会通过一个网站:人人都是蜘蛛侠 来学习浏览器的工作原理。(这是我们自己搭建的网站,方便教学和实操)

    在这里插入图片描述
    在这里插入图片描述
    首先,我们在浏览器的地址栏输入网址(也可以叫URL)。然后,浏览器向服务器传达了我们想访问某个网页的需求,这个过程就叫做【请求】。

    紧接着,服务器把你想要的网站数据发送给浏览器,这个过程叫做【响应】。

    所以浏览器和服务器之间,先请求,后响应,有这么一层关系。

    爬虫的工作原理
    在这里插入图片描述
    爬虫学习大纲
    在这里插入图片描述

    0关,初识爬虫,你会了解爬虫的工作原理,写出一个简单的爬虫程序,学会爬虫的第0步:获取数据。
    
    icon
    第1关,你将会快速入门HTML基础知识,达到读懂和修改HTML文档的水平。有了这些基础,你才能去学习如何解析数据和提取数据。
    
    icon
    第2345关,我会教你爬虫的第1和第2步:解析数据和提取数据。同时,你还会学到两种不同的发起请求的方式。
    
    icon
    在第6关,你将学会存储数据,即把目标数据写入到本地的Excel表格中。到此,你就学会了爬虫完整的四个步骤,掌握了最基本的爬虫技能啦。
    
    icon
    第7关,我们一起做一个项目,爬取一个知乎大v的所有文章,并且存到Excel中。以此,我们巩固和复习了0-6关的所有知识。第7关会是一个分水岭,后面关卡的进阶知识都建立在前7关的基础上。
    
    icon
    第8关,学会cookies,就可以让浏览器记住你,你们可以更方便地长期保持联系,而不是在一次见面之后就相忘于江湖。
    
    icon
    第9关,学习控制浏览器,来应对爬虫中一些更复杂的情况。第10关,你的爬虫会变得更自动化,爬虫程序不但可以定时工作,还可以把爬取结果传递给你。
    
    icon
    接下来的4关,你将学会更高效更强大的爬虫方法,让爬虫技能升级。
    
    icon
    第15关毕业总结,就到了告别的时刻了。这时你也学成出师,可以用爬虫知识去做自己想做的事情了,让爬虫为你消灭重复劳动,高效获取信息,创造出更多价值。
    
    icon
    以上,就是爬虫学习大纲。
    
    # 引入requests库
    import requests
    
    # requests.get是在调用requests库中的get()方法,它向服务器发送了一个请求,括号里的参数是你需要的数据所在的网址,然后服务器对请求作出了响应。
    # 我们把这个响应返回的结果赋值给变量res
    res = requests.get('URL')
    

    在这里插入图片描述
    现在,我们试着用requests.get()来下载一个小说——《三国演义》:
    在这里插入图片描述

    # 来吧,写代码吧    
    import requests
    url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md'
    response = requests.get(url)
    

    在这里插入图片描述

    个人公众号  yk 坤帝
    后台回复 scrapy 获取整理资源
    import requests 
    
    res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png') 
    # 打印变量res的响应状态码,以检查请求是否成功
    print(res.status_code)
    

    icon
    第5行代码是在打印res的响应状态码,它可以用来检查我们的requests请求是否得到了成功的响应。我们看到终端结果显示了200,这个数字代表服务器同意了请求,并返回了数据给我们。

    icon
    除了200,我们还可能收到其他的状态码。下面有一个表格,供你参考不同的状态码代表什么,但不需要记住它们,在遇到问题的时候查询就好。

    在这里插入图片描述
    icon
    response.status_code是一个很常用的属性,在我们之后的爬虫代码中也将多次出现。
    在这里插入图片描述
    icon
    接着的属性是response.content,它能把Response对象的内容以二进制数据的形式返回,适用于图片、音频、视频的下载,看个例子你就懂了。

    icon
    假如我们想下载这张图片,它的URL是:https://res.pandateacher.com/2018-12-18-10-43-07.png

    在这里插入图片描述

    # 引入requests库
    import requests
    
    # 发出请求,并把返回的结果放在变量res中
    res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png')
    # 把Reponse对象的内容以二进制数据的形式返回
    pic = res.content
    # 新建了一个文件ppt.jpg,这里的文件没加路径,它会被保存在程序运行的当前目录下。
    # 图片内容需要以二进制wb读写。你在学习open()函数时接触过它。
    photo = open('ppt.jpg','wb')
    # 获取pic的二进制内容
    photo.write(pic) 
    # 关闭文件
    photo.close()
    
    

    icon
    这样,我们的图片就下载成功啦~你也可以在本地运行这个程序。

    icon
    讲完了response.content,继续看response.text,这个属性可以把Response对象的内容以字符串的形式返回,适用于文字、网页源代码的下载。

    icon
    举个例子,我们还是来下载小说《三国演义》的第一回。

    # 引用requests库
    import requests
    
    # 下载《三国演义》第一回,我们得到一个对象,它被命名为res
    res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
    # 把Response对象的内容以字符串的形式返回
    novel=res.text
    # 现在,可以打印小说了,但考虑到整章太长,只输出800字看看就好。在关于列表的知识那里,你学过[:800]的用法。
    print(novel[:800])
    

    icon
    之后,我们就可以用通过读写文件把小说保存到本地了。这是Python基础语法知识,你应该已经学会了。下面直接给出做法,你也可以在自己的本地电脑上做尝试练习。

    # 引入requests库
    import requests
    #下载《三国演义》第一回,我们得到一个对象,它被命名为res
    res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
    # 把Response对象的内容以字符串的形式返回
    novel = res.text
    # 创建一个名为《三国演义》的txt文档,指针放在文件末尾,追加内容
    k = open('《三国演义》.txt','a+')
    # 写进文件中 
    k.write(novel)
    # 关闭文档    
    k.close()
    
    

    在这里插入图片描述

    爬虫伦理
    icon
    就像是两个人在来来往往的相处中,会考虑对方的感受;在互联网的世界中,我们也要考虑一下服务器对爬虫的感受是怎样的。

    icon
    我们说过,服务器其实就是一个超级电脑,拥有这个服务器的公司,对爬虫其实也有明确的态度。

    icon
    通常情况下,服务器不太会在意小爬虫,但是,服务器会拒绝频率很高的大型爬虫和恶意爬虫,因为这会给服务器带来极大的压力或伤害。

    icon
    不过,服务器在通常情况下,对搜索引擎是欢迎的态度(刚刚讲过,谷歌和百度的核心技术之一就是爬虫)。当然,这是有条件的,通常这些条件会写在robots协议里。

    icon
    robots协议是互联网爬虫的一项公认的道德规范,它的全称是“网络爬虫排除标准”(robots exclusion protocol),这个协议用来告诉爬虫,哪些页面是可以抓取的,哪些不可以。

    icon
    我们使用robots协议的场景通常是:看到想获取的内容后,检查一下网站是否允许爬取。因此我们只需要能找到、简单读懂robots协议就足够了。

    icon
    我们截取了一部分淘宝的robots协议,可以看到淘宝对百度和谷歌这两个爬虫的访问规定,以及对其它爬虫的规定。

    icon
    有的同学可能就要问了:“域名是什么?域名和URL(网址)有什么关系?”很敏锐哟!

    icon
    我们前面说过,如果把一个网页类比为一幢房子,URL指示了网页的地址,就像房子在地球上的详细到某某街道某某号的具体地址,那么域名就像房子所在的国家,指示了网站的地址。

    icon
    如果我们看到一个网页,想爬上面的内容,怎么找到它的URL我们刚刚学过了,如果网页的URL是https://pypi.org/project/requests/,那么,此网站的域名是pypi.org;如果网页的URL是http://cn.python-requests.org/zh_CN/latest/,那么网站的域名是cn.python-requests.org。

    icon
    我们再来看一个,如果网页的URL是https://www.taobao.com/markets/3c/tbdc?spm=a21bo.2017.201867-main.11.5af911d9VV8EyS,那么网站的域名是www.taobao.com。

    
    单选题
    看懂了么?我们来试一次,某网页的网址是https://www.bilibili.com/v/douga/?spm_id_from=333.851.b_7072696d6172794368616e6e656c4d656e75.1,那么网站的域名是?
    

    答对了!

    icon
    没错,你已经找到了规律!

    icon
    有个课后思考交给你:域名中会藏着网站的国籍或功能领域等信息,那么.cn,.com,.gov结尾的域名分别代表了什么?
    icon
    来看一个实例:我们截取了一部分淘宝的robots协议 (

    http://www.taobao.com/robots.txt)。在截取的部分,可以看到淘宝对百度和谷歌这两个爬虫的访问规定,以及对其它爬虫的规定。
    
    User-agent:  Baiduspider # 百度爬虫
    Allow:  /article # 允许访问 article 
    Allow:  /oshtml # 允许访问 oshtml 
    Allow:  /ershou # 允许访问 ershou 
    Allow: /$ # 允许访问根目录,即淘宝主页
    Disallow:  /product/ # 禁止访问product文件夹下面的所有文件,但是product文件夹本身允许被访问
    Disallow:  / # 禁止访问除 Allow 规定页面之外的其他所有页面
    ​
    User-Agent:  Googlebot # 谷歌爬虫
    Allow:  /article
    Allow:  /oshtml
    Allow:  /product # 允许访问product文件夹及product文件夹下面的所有文件
    Allow:  /spu
    Allow:  /dianpu
    Allow:  /oversea
    Allow:  /list
    Allow:  /ershou
    Allow: /$
    Disallow:  / # 禁止访问除 Allow 规定页面之外的其他所有页面
    


    …… # 文件太长,省略了对其它爬虫的规定,想看全文的话,点击上面的链接

    User-Agent: * # 其他爬虫
    Disallow: / # 禁止访问所有页面
    icon
    可以看出robots协议是“分段”的吗?每个段落都含有以下两种字段:一种是User-agent:,另一种是Allow:或Disallow:。

    icon
    User-agent表示的是爬虫类型,上面的示例代码注释了“百度爬虫”和“谷歌爬虫”,我们自己写的爬虫一般要看User-Agent: *,*指向所有未被明确提及的爬虫。

    icon
    Allow代表允许被访问,Disallow代表禁止被访问。字段对应的值都含有路径分隔符/,限制了哪些或哪一层目录的内容是允许或者禁止被访问的。可以对比上述百度爬虫Disallow: /product/和谷歌爬虫Allow: /product的注释行理解一下。

    练习介绍

    要求:
    获取文章《HTTP状态响应码》全部内容,并且打印出全文内容。

    目的:
    练习获取网上的文本文件。
    题目要求:获取文章《HTTP状态响应码》全部内容,并且打印出全文内容。

    获取数据:

    文本URL:
    https://localprod.pandateacher.com/python-manuscript/crawler-html/exercise/HTTP%E5%93%8D%E5%BA%94%E7%8A%B6%E6%80%81%E7%A0%81.md

    首先调用requests库,使用requests.get(‘URL’)获取文件,返回的是Response对象。

    然后需要把Response对象用合适的数据形式返回。

    存储数据:

    存储文件的三个步骤:打开文件,存储文件,关闭文件。

    import requests
    
    destnation_url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/exercise/HTTP%E5%93%8D%E5%BA%94%E7%8A%B6%E6%80%81%E7%A0%81.md'
    res = requests.get (destnation_url) 
    print(res.status_code) # 查看响应码
    article=res.text # 把Response对象的内容以字符串的形式返回
    print(article)
    

    返回结果如下

    # HTTP响应状态码
    
    
    ## 1xx:临时响应
    #### 表示临时响应并需要请求者继续执行操作的状态代码。
    
    100   **继续**请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。 
    101   **切换协议**请求者已要求服务器切换协议,服务器已确认并准备切换。
    
    ---
    
    ## 2xx : 成功
    #### 表示成功处理了请求的状态代码。
    
    200   **成功**  服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。
    201   **已创建**  请求成功并且服务器创建了新的资源。
    202   **已接受**  服务器已接受请求,但尚未处理。
    203   **非授权信息**  服务器已成功处理了请求,但返回的信息可能来自另一来源。
    204   **无内容**  服务器成功处理了请求,但没有返回任何内容。
    205   **重置内容**服务器成功处理了请求,但没有返回 任何内容。
    206   **部分内容**  服å¡器成功处理了部分 GET 请求。
    
    ---
    
    ## 3xx : 重定向
    #### 表示要完成请求,需要进一步操作。通常,以下状态代码用来重定向。
    
    300   **多种选择**  针对请求,服务器可执行多种操作。服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
    301   **永久移动**  请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
    302   **临时移动**  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
    303   **查看其他位置**请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
    
    304   **未修改**自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
    305   **使用代理**请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理。
    307   **临时重定向**  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
    
    ---
    
    ## 4xx:请求错误
    ### 以下状态代码表示请求可能出错,妨碍了服务器的处理。
     
    400   **错误请求**服务器不理解请求的语法。
    401   **未授权**请求要求身份验证。对于需要登录的网页,服务器可能返回此响应。
    403   **禁止**服务器拒绝请求。
    404   **未找到**服务器找不到请求的网页。
    405   **方法禁用**禁用请求中指定的方法。
    406   **不接受**无法使用请求的内容特性响应请求的网页。
    407   **需要代理授权**此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
    408   **请求超时**  服务器等候请求时发生超时。
    409   **冲突**  服务器在完成请求时发生冲突。服务器必须在响应中包含有关å²突的信息。
    410   **已删除**  如果请求的资源已永久删除,服务器就会返回此响应。
    411   **需要有效长度**服务器不接受不含有效内容长度标头字段的请求。
    412   **未满足前提条件**服务器未满足请求者在请求中设置的其中一个前提条件。
    413   **请求实体过大**服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
    414   **请求的 URI 过长**请求的 URI(通常为网址)过长,服务器无法处理。
    415   **不支持的媒体类型**请求的格式不受请求页面的支持。
    416   **请求范围不符合要求**如果页面无法提供请求的范围,则服务器会返回此状态代码。
    417   **未满足期望值**服务器未满足"期望"请求标头字段的要求。
    
    ---
    
    ## 5xx:服务器错误
    ### 以下状态代码表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。
    
    500   **服务器内部错误**  服务器遇到错误,无法完成请求。
    501   **尚未实施**服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。
    502   **错误网关**服务器作为网关或代理,从上游服务器收到无效响应。
    503   **服务不可用**服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
    504   **网关超时**  服务器作为网关或代理,但是没有及时从上游服务器收到请求。
    505   **HTTP 版本不受支持**服务器不支持请求中所用的 HTTP 协议版本。
    
    
    
    个人公众号  yk 坤帝
    后台回复 scrapy 获取整理资源
    

    练习介绍
    要求:
    获取下面的图片,并且储存图片。

    在这里插入图片描述

    目的:
    练习获取网上的图片文件。

    个人公众号  yk 坤帝
    后台回复 scrapy 获取整理资源
    import requests
    
    # 发出请求,并把返回的结果放在变量res中
    res = requests.get('https://res.pandateacher.com/2019-01-12-15-29-33.png')
    # 把Reponse对象的内容以二进制数据的形式返回
    pic=res.content
    # 新建了一个文件ppt.jpg,这里的文件没加路径,它会被保存在程序运行的当前目录下。
    # 图片内容需要以二进制wb读写。你在学习open()函数时接触过它。
    photo = open('spider.jpg','wb')
    # 获取pic的二进制内容
    photo.write(pic) 
    # 关闭文件
    photo.close()
    

    练习介绍
    题目要求:

    获取下面的音乐,并且储存它,然后请刷新页面,这样你就可以在【文件】内看到它。音乐URL:

    https://static.pandateacher.com/Over%20The%20Rainbow.mp3

    获取数据
    音乐URL:https://static.pandateacher.com/Over%20The%20Rainbow.mp3

    首先调用requests库,使用requests.get(‘URL’)获取文件,返回的是Response对象。

    然后需要把Response对象用合适的数据形式返回。

    存储文件
    存储文件的三个步骤:打开文件,存储文件,关闭文件。

    import requests
    
    # 发出请求,并把返回的结果放在变量res中
    res = requests.get('https://static.pandateacher.com/Over%20The%20Rainbow.mp3')
    # 把Reponse对象的内容以二进制数据的形式返回
    mp3 = res.content
    # 新建了一个文件rainbow.mp3,这里的文件没加路径,它会被保存在程序运行的当前目录下。
    # 音频内容需要以二进制wb读写。你在学习open()函数时接触过它。
    music = open('rainbow.mp3','wb')
    # 写入mp3的二进制内容
    music.write(mp3) 
    # 关闭文件
    music.close()
    

    1.python第三方模块下载
    Windows:
    windows系统
    进入命令行窗口 win+r

    1.pip install 模块 国外镜像源 下载速度慢

    2.pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 模块 国内清华镜像源 下载速度快

    3.http://pypi.douban.com/simple/ 模块 国内豆瓣镜像源 下载速度快

    4.https://pypi.mirrors.ustc.edu.cn/simple/ 模块 阿里云

    5.https://pypi.tuna.tsinghua.edu.cn/simple/ 中科大

    如果你那儿的网络总是不给力,又不想每次手动添加,可以加在配置文件里一劳永逸。

    2.scrapy框架爬虫

    1.定位到相应文件夹 Windows: windows系统 进入命令行窗口 win+r

    2.scrapy startproject 项目

    3.scrapy genspider 名称 www.xxx.com

    基于CrawlSpider爬虫父类的创建
    scrapy genspider -t crawl 名称 www.xxx.com
    
    分布式爬虫:
      执行工程 scrapy runspider xxx.py
    

    3.python使用matplotlib模块绘制折线图相关参数

    在这里插入图片描述
    在这里插入图片描述
    4.numpy读取本地数据

    np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)

    在这里插入图片描述
    5.lambda函数用法

    个人公众号 yk 坤帝
    学习更多硬核知识。
    
    f = open('命运1.txt','r')
    txt = f.read()
    d = {}
    for i in txt:
        if i not in ',。?!—《》:‘’“”()□':    
            d[i] = d.get(i,0) + 1
    ls = list(d.items())
    ls.sort(key=lambda x:x[1],reverse = True)
    print("{}:{}".format(ls[0][0],ls[0][1]))
    
    f.close()
    

    命运1.txt文件在我的资源中下载

    6. list,sort,lambda模块区别联系

    list.sort(key=lambda x:x[1],reverse = True)
    

    首先说一下 sort函数

    sort函数是一个专门对列表进行排序的一个函数,下面是官方的解释
    在这里插入图片描述

    我的理解是,按照列表维度(指数组中第0,1,2个元素)进行排序,默认为从小到大,'reverse=True’则意味着从大到小。

    关于维度,形象地理解如下:

    list = [('i','he',5), ('q', 'I', 3), ('p', 'they', 1)]中,

    x:x[0]中,
    x表示列表中的元素,
    x[0]表示列表中的元素的索引为0的元素
    key=lambda x:x[0]
    相当于对’i’, ‘q’, 'p’进行排序,
    其中x可以换成其他变量。x:x[1]
    ***

    那这个key=lambda x: x[1] 是什么意思呢? 其实可以把lambda看作一个隐函数,在这里可以不用管它,记得有这个就可以,

    后面的x: x[1] 为对前面的对象中的第二维数据(即value)的值进行排序。

    7.爬虫requests模块解析

    # 调用requests模块
    个人公众号 yk 坤帝
    后台回复 面试项目整理 获取整理资源
    
    import requests
    # 获取网页源代码,得到的res是response对象。
    res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html') 
    # 检测请求是否正确响应
    print(res.status_code) 
    res.encoding=res.apparent_encoding
    # 正确响应,进行读写操作
    # 新建一个名为book的html文档,你看到这里的文件没加路径,它会被保存在程序运行的当前目录下。
    # 字符串需要以w读写。你在学习open()函数时接触过它。
    if res.status_code == 200:
        file = open('book1.html','wb')
        # res.text是字符串格式,把它写入文件内。
        file.write(res.content) 
        # 关闭文件
        file.close() 
    

    8.爬虫bs4,BeautifulSoup解析

    from bs4 import BeautifulSoup
    
    res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spder-men0.0.html')
    
    print(res.status_code)
    soup = BeautifulSoup(res.content,'html.parser')
    #soup输出的内容于text一样,但格式不一样
    #(soup)
    item = soup.find('div')
    
    #print(type(item))
    
    #print(item)
    
    items = soup.find_all('div')
    
    #print(items)
    
    res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
    
    soup = BeautifulSoup(res.text,'html.parser')
    
    items = soup.find_all('div',class_='books')
    
    #print(items)
    
    #print(type(items))
    
    for item in items:
    
        #print('想找的数据都包含在这里了:\n',item)
    
    #print(type(item))
        kind = item.find('h2')
        title = item.find(class_='title')
        bref = item.find(class_='info')
        print(kind.text,'\n',title.text,'\n',title['href'],'\n',bref.text)
        print(type(kind),type(title),type(bref))
    

    9.模拟器打开开发者模式

    模拟器打开开发者模式

    appium连接模拟器进行自动化测试时,需要使用adb来连接模拟器,具体操作步骤:

    1. 打开模拟器

    2. 在cmd中输入:adb devices

    此时出现的列表中找不到对应的安卓设备

    1. 在cmd中输入:adb connect 127.0.0.1:5555(5555为模拟器对应的端口号,此处为雷电模拟器)

    2. 再次输入:adb devices,列表中找到对应模拟器表面连接成功

    下面是其他几款流行的模拟器单位端口:

    adb 命令连接模拟器
    天天模拟器端口 6555
    adb connect 127.0.0.1:6555
    
    海马模拟器
    adb connect 127.0.0.1:26944
    
    mumu模拟器 6.0
    adb connect 127.0.0.1:7555
    
    逍遥游模拟器
    adb connect 127.0.0.1:21503
    
    夜神模拟器
    adb connect 127.0.0.1:62001
    

    10. d.get()用法解析

    d[i] = d.get(i,0)+1
    
    f = open('命运.txt','r')
    txt = f.read()
    d = {}
    for i in txt:
        if i not in '\n':
            d[i] = d.get(i,0)+1
    ls = list(d.items())
    ls.sort(key=lambda x:x[1], reverse=True) # 此行可以按照词频由高到低排序
    for k in range(10):
        print(ls[k][0],end = '')
    
    f.close()
    

    d[i] = d.get(i,0)+1
    d[i]代表字典d中符号i对应的键值
    d.get()有两个参数时,理解为当i对应键值不存在时返回第二个参数作为键值,在本例中代表当i键值不存在时,返回0为i的键值,加1代表每次遍历到i键值加一,第二次遍历到i时,d.get(i,0)返回1,以此类推。
    第三次遍历到i时,d.get(i,0)返回2,对应字典中i的键值

    11.jieba模块用法

    import jieba
    s = input("请输入一个字符串")
    n = len(s) 
    m = len(jieba.lcut(s))
    print("中文字符数为{},中文词语数为{}。".format(n, m))
    
    展开全文
  • Python 爬虫系列教程一爬取批量百度图片

    万次阅读 多人点赞 2018-07-29 19:40:05
    很久之前就学习了Python的爬虫了,也用来做过一些项目(主要是一些课程项目),但时间比较紧,一直没有空把它写下来,这个暑假,我可能会逐渐更新Python爬虫的相关知识。 项目1:实现批量爬取百度图片 先简单的...

    很久之前就学习了Python的爬虫了,也用来做过一些项目(主要是一些课程项目),但时间比较紧,一直没有空把它写下来,这个暑假,我可能会逐渐更新Python爬虫的相关知识。

    项目1:实现批量爬取百度图片

    先简单的介绍下这个项目。当你需要下载大量图片的时候,或许你会去百度图片里一张张右键下载,但这样未免太麻烦了,有了这个工具,你直接运行下程序,输入你想要下载图片的关键字,然后输入你想要下载图片的数量,你就成功下载图片了!

    下面给下演示程序的截图:

    几秒钟后,我去C盘文件夹下,就有了30张,张天爱的图片啦!

    是不是觉得,这样下载起来比较方便........

    好了,言归正传,下面开始一步步教大家,怎么实现它!

    1. Python的IDE,我想大家应该都有吧,我用的是pycharm,大家可以去官网上下载,这里顺带给大家推荐一个免费试用它的方法,当然,仅限于在校大学生(如果你是高中生的话,可能需要麻烦一点,去百度找注册码,大概每个月会更新一次的样子)

    首先,你先到jetBrains 官网,官网链接在这!打开后。

    你点击右上角的人物标志,进入账号登录页面。

    之后,你在打开这个注册账号的链接:学生账号注册链接

    点击立即申请!

    你会进入这个页面:

    这里需要一个学校的公邮,这个公邮去哪里找呢?你可以去你所在学校的官网找找,每个在校大学生都可以申请200个学校公邮的(反正我们学校是这样),你可以搜索你们学校的邮箱系统,去查看具体怎么申请,每个学校可能不同。

    申请好了以后,你在回到一开始让你进入的登录页面,登录以后,就可以免费下载使用了。

    2 .安装爬虫需要的包

     (1)如果你使用的是pycharm,那么你安装包会非常的方便,在pycharm里找的Terminal 点击,输入pip install ....就可以安装包了,当然如果是你首次运行的话,可能需要你更新pip工具,这你最好去官网重新下载下pip,这样你以后会很方便,这里就不在具体讲怎么更新pip了,以后有时间在写写吧。

     (2) 依次键入pip install BeautifulSoup  

                             pip insatll requests

                             pip install  lxml 

     (3)下面将分别介绍他们的用途:

       BeautifulSoup 是用来获取一个页面里面的各个标签及里面的内容,我们主要用到它里面的find(),find_All()函数,具体用法将在后面一一介绍

      requests 是用来获取网页信息的,也就是说,我们给它一个url,它能把这个url对应的页面信息全部反馈给我们,这时候我们在用beautifulSoup里的函数对他们进行处理

    lxml 是一个解析器,python里有专门的解析器,html.parser,但是lxml的解析速度优于html_parser,所以建议使用lxml

    3. Python正则表达式基础

      要想提升写爬虫的能力,那么你必须学会正则表达式,它可以让你用简短的代码实现你想要的功能。

    详细的知识,可以到这里去看.python 正则表达式

    下面我会介绍,本次项目里使用到的技巧:

    首先你先打开百度图片 ,也就是这个页面 百度图片

    然后,你可以随便输入你想要查看的图片....(不好意思,我还是输入了,zhang tian ai)

     

    注意:先点击右上角,切换成传统翻页版,因为这样有利于我们爬取图片!这里一定要注意,很多网友问我,为啥他打开百度图片,每一页不是60张图片。因为你直接打开的网页,不便于翻页操作,并且每一页的图片数量不相同。所以,我选择爬取的方法是,从传统翻页版爬取图片。

    接着,你右键检查网页源代码(如果你用的是谷歌浏览器),那么你可以在里面直接搜索 objURL 或者URL

    现在我们发现了我们需要图片的url了,现在,我们要做的就是将这些信息爬取出来(网页中有objURL,hoverURL...但是我们用的是objURL,因为这个是原图),如何获取objURL?当然你可以暴力写个程序跑一遍,但是这程序写起来.....

    那我们该如何用正则表达式实现呢?其实只需要一行代码.....

    就是这么简单,我想你如果看了正则表达式,一定可以轻松的写出或者理解这句话。

    经过我的实验,我发现传统翻页版的百度图片,每一页有60张图片。这也是为啥后面我写代码,用了t+60。

    4 . BeautifulSoup知识介绍

    同样的我先给出文档链接,具体细节大家自己研究,我这里只介绍这个项目用到的知识。BeautifulSoup 文档

    我们主要用到的是find()和find_All()函数:

    5. requests 介绍

    requests文档

    requests博大精深,我们这里只不过是用了它的一个功能而已。

    html = requests.get(url) 我们将url传进去,它就会得到这个url里面的信息,具体的,大家可以在python里运行试试.

    6. 项目实现思路

     首先需要写一个下载图片的函数,其次还有检测图片数量的函数,还有最后的推荐函数(推荐函数,主要是根据你键入的文本,在百度图片里找到相似的内容,返回给用户,类似于百度搜索的最下面)

    首先是图片下载函数:下面是部分代码

    具体思路就是根据正则表达式,找到url,然后完成下载。

     

    其次是推荐函数:

    推荐函数,主要公能是把百度的相关搜索提示返回给用户,实现很简单,但需要注意编码的问题(关于python编码格式的问题,我觉得能写10000字,以后有空再慢慢写吧)。

    还有是检测图片数量函数,它的主要思路是通过计算能翻的页数来估算总数量,比如一个页面有20张图片,那么我点下一页50次,那么就说明有1000张图片....虽然这样很傻(哈哈)

    因为有些图片可能有很多张(估计要翻页10000多次),所以为了能在几秒内下载好图片,我把图片是上限设为了1020张,也就是说即使有100000张图片,我也就先告诉你只有1020张(当然你也可以把它设置为无限,可能会慢一点)

    7 主函数

    主函数主要是一些逻辑上的问题,为的就是让用户使用更便捷而已,具体我就不一一解释,我想大家看源码比看我写 的文字更有感觉。

    之前会出现下载重复的bug,现在已经解决了。

    8 源代码:

    # -*- coding: utf-8 -*-
    """
    Created on Sun Sep 13 21:32:25 2020
    
    @author: ydc
    """
    
    
    
    
    import re
    import requests
    from urllib import error
    from bs4 import BeautifulSoup
    import os
    
    num = 0
    numPicture = 0
    file = ''
    List = []
    
    
    def Find(url, A):
        global List
        print('正在检测图片总数,请稍等.....')
        t = 0
        i = 1
        s = 0
        while t < 1000:
            Url = url + str(t)
            try:
                # 这里搞了下
                Result = A.get(Url, timeout=7, allow_redirects=False)
            except BaseException:
                t = t + 60
                continue
            else:
                result = Result.text
                pic_url = re.findall('"objURL":"(.*?)",', result, re.S)  # 先利用正则表达式找到图片url
                s += len(pic_url)
                if len(pic_url) == 0:
                    break
                else:
                    List.append(pic_url)
                    t = t + 60
        return s
    
    
    def recommend(url):
        Re = []
        try:
            html = requests.get(url, allow_redirects=False)
        except error.HTTPError as e:
            return
        else:
            html.encoding = 'utf-8'
            bsObj = BeautifulSoup(html.text, 'html.parser')
            div = bsObj.find('div', id='topRS')
            if div is not None:
                listA = div.findAll('a')
                for i in listA:
                    if i is not None:
                        Re.append(i.get_text())
            return Re
    
    
    def dowmloadPicture(html, keyword):
        global num
        # t =0
        pic_url = re.findall('"objURL":"(.*?)",', html, re.S)  # 先利用正则表达式找到图片url
        print('找到关键词:' + keyword + '的图片,即将开始下载图片...')
        for each in pic_url:
            print('正在下载第' + str(num + 1) + '张图片,图片地址:' + str(each))
            try:
                if each is not None:
                    pic = requests.get(each, timeout=7)
                else:
                    continue
            except BaseException:
                print('错误,当前图片无法下载')
                continue
            else:
                string = file + r'\\' + keyword + '_' + str(num) + '.jpg'
                fp = open(string, 'wb')
                fp.write(pic.content)
                fp.close()
                num += 1
            if num >= numPicture:
                return
    
    
    if __name__ == '__main__':  # 主函数入口
    
    ##############################
        # 这里加了点
        headers = {
            'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
            'Connection': 'keep-alive',
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0',
            'Upgrade-Insecure-Requests': '1'
        }
    
        A = requests.Session()
        A.headers = headers
    ###############################
    
        word = input("请输入搜索关键词(可以是人名,地名等): ")
        # add = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%BC%A0%E5%A4%A9%E7%88%B1&pn=120'
        url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + word + '&pn='
    
        # 这里搞了下
        tot = Find(url, A)
        Recommend = recommend(url)  # 记录相关推荐
        print('经过检测%s类图片共有%d张' % (word, tot))
        numPicture = int(input('请输入想要下载的图片数量 '))
        file = input('请建立一个存储图片的文件夹,输入文件夹名称即可')
        y = os.path.exists(file)
        if y == 1:
            print('该文件已存在,请重新输入')
            file = input('请建立一个存储图片的文件夹,)输入文件夹名称即可')
            os.mkdir(file)
        else:
            os.mkdir(file)
        t = 0
        tmp = url
        while t < numPicture:
            try:
                url = tmp + str(t)
    
                # 这里搞了下
                result = A.get(url, timeout=10, allow_redirects=False)
            except error.HTTPError as e:
                print('网络错误,请调整网络后重试')
                t = t + 60
            else:
                dowmloadPicture(result.text, word)
                t = t + 60
    
        print('当前搜索结束,感谢使用')
        print('猜你喜欢')
        for re in Recommend:
            print(re, end='  ')

    好了,就先写这么多。欢迎大家转载。如有问题,欢迎给我留言。

     

     

    2019年4月2日  第3次更新

    这次有网友想要爬取大量的图片作为训练材料。他想要300种不同的图片,每种100张,如果还是按之前的代码去运行,就需要他输入300次图片的名称,这样是非常浪费时间的。所以这里对代码进行一些改进,你只需要把你想要爬取图片的名称,编辑到一个txt文件,然后输入你需要的数量就行。

     

    使用方法:

    首先将你需要下载的图片名称写到一个txt文本上,文本的名字叫name即可。

    按行输入,每行放一个名字。

    将name.txt放入和你当前python文件同一目录下即可。

     

    代码:

    # -*- coding: utf-8 -*-
    """
    Created on Sun Sep 13 21:35:34 2020
    
    @author: ydc
    """
    
    import re
    import requests
    from urllib import error
    from bs4 import BeautifulSoup
    import os
    
    num = 0
    numPicture = 0
    file = ''
    List = []
    
    
    def Find(url, A):
        global List
        print('正在检测图片总数,请稍等.....')
        t = 0
        i = 1
        s = 0
        while t < 1000:
            Url = url + str(t)
            try:
                # 这里搞了下
                Result = A.get(Url, timeout=7, allow_redirects=False)
            except BaseException:
                t = t + 60
                continue
            else:
                result = Result.text
                pic_url = re.findall('"objURL":"(.*?)",', result, re.S)  # 先利用正则表达式找到图片url
                s += len(pic_url)
                if len(pic_url) == 0:
                    break
                else:
                    List.append(pic_url)
                    t = t + 60
        return s
    
    
    
    def recommend(url):
        Re = []
        try:
            html = requests.get(url, allow_redirects=False)
        except error.HTTPError as e:
            return
        else:
            html.encoding = 'utf-8'
            bsObj = BeautifulSoup(html.text, 'html.parser')
            div = bsObj.find('div', id='topRS')
            if div is not None:
                listA = div.findAll('a')
                for i in listA:
                    if i is not None:
                        Re.append(i.get_text())
            return Re
    
    def dowmloadPicture(html, keyword):
        global num
        # t =0
        pic_url = re.findall('"objURL":"(.*?)",', html, re.S)  # 先利用正则表达式找到图片url
        print('找到关键词:' + keyword + '的图片,即将开始下载图片...')
        for each in pic_url:
            print('正在下载第' + str(num + 1) + '张图片,图片地址:' + str(each))
            try:
                if each is not None:
                    pic = requests.get(each, timeout=7)
                else:
                    continue
            except BaseException:
                print('错误,当前图片无法下载')
                continue
            else:
                string = file + r'\\' + keyword + '_' + str(num) + '.jpg'
                fp = open(string, 'wb')
                fp.write(pic.content)
                fp.close()
                num += 1
            if num >= numPicture:
                return
    
    
    if __name__ == '__main__':  # 主函数入口
        
        
        headers = {
            'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
            'Connection': 'keep-alive',
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0',
            'Upgrade-Insecure-Requests': '1'
            }
    
        A = requests.Session()
        A.headers = headers
        
        
        ###############################
        
        
        tm = int(input('请输入每类图片的下载数量 '))
        numPicture = tm
        line_list = []
        with open('./name.txt', encoding='utf-8') as file:
            line_list = [k.strip() for k in file.readlines()]  # 用 strip()移除末尾的空格
    
        for word in line_list:
            url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + word + '&pn='
            tot = Find(url,A)
            Recommend = recommend(url)  # 记录相关推荐
            print('经过检测%s类图片共有%d张' % (word, tot))
            file = word + '文件'
            y = os.path.exists(file)
            if y == 1:
                print('该文件已存在,请重新输入')
                file = word+'文件夹2'
                os.mkdir(file)
            else:
                os.mkdir(file)
            t = 0
            tmp = url
            while t < numPicture:
                try:
                    url = tmp + str(t)
                    #result = requests.get(url, timeout=10)
                    # 这里搞了下
                    result = A.get(url, timeout=10, allow_redirects=False)
                    print(url)
                except error.HTTPError as e:
                    print('网络错误,请调整网络后重试')
                    t = t + 60
                else:
                    dowmloadPicture(result.text, word)
                    t = t + 60
            numPicture = numPicture + tm
            
        print('当前搜索结束,感谢使用')

     

    如遇到bug或者有新的需求,可以给我留言。

    最新情况:由于笔者最近忙于备考,很多找我问问题的朋友我没能尽力的去帮忙。大家给我的留言我可能不能及时回复,同时很多加我微信好友的,我也不能及时回复。但我还是会抽时间尽力解决大家提出的问题。(2019.06.16)

    2019年8月4日  第4次更新

    还是有很多同学问我怎么更改每次下载的图片数量,我一开始设置的最高只能下载1060张:

    更改方法:把代码中含有1000的地方,全部换成你想要的数字。(例如每类图片都想下载5000张,那么你把1000改成5000)

    最近有很多网友留言和加我微信。我都没有回复,原因在于笔者正在备考。明年才有空。2019.11.29

     

    2020.4.13更新。

    最后在写一下,我代码里面用了t+60是因为,每一页有60张图片,我爬完一页,就代表已经获得60张图片,然后翻页,开始爬取下一页。

    另:这个项目是根据网友们的反馈,才得到不断的完善。这已经不再是我一个人的项目了,而是属于各位一起帮忙反馈bug的网友们。非常感谢各位的反馈。

    目前笔者仍然没有时间,之前收到一位网友的反馈,一直没有更新。等我5月复试结束以后,我会更新的。

    若有网友发现问题,也欢迎继续反馈给我,我后面会找时间更新的。

     

    2020.9.13

    之前遇到的问题已经解决。感谢网友们的大力支持。

     

    展开全文
  • Python爬虫介绍

    千次阅读 2018-08-01 14:30:39
    Python爬虫介绍   什么是爬虫: 爬虫:一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信息;   Python爬虫架构: Python爬虫架构主要由五个部分组成,分别是 调度器、URL管理器、网页下载器...
  • 推荐一下我建的python学习交流qun:850973621,群里有免费的视频教程,开发工具、 ...URL管理器:包括待爬取的URL地址和已爬取的URL地址,防止重复抓取URL和循环抓取URL,实现URL管理器主要用三种方式.
  • Python 爬虫

    千次阅读 2018-10-13 15:24:38
    Python中有很多库可以用来抓取网页,我们先学习urllib2。 urllib2 是 Python2.7 自带的模块(不需要下载,导入即可使用) urllib2 官方文档:https://docs.python.org/2/library/urllib2.html urllib2...
  • python爬虫文档

    2018-12-13 13:17:54
    python爬虫与项目实战,网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。 随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的...
  • python爬虫到有价值的数据,进行建模,挖掘就会产生商业价值,下面是小编为您整理的关于python爬虫赚钱的途径,希望对你有所帮助。python爬虫赚钱的途径Python语言这两年是越来越火了,它慢慢崛起也是有原因的。...
  • 最近项目需要将批量链接中的pdf文档下来处理,根据以下步骤完成了任务:将批量下载链接copy到text中,每行1个链接; 再读txt文档构造url_list列表,利用readlines返回以行为单位的列表; 利用str的rstrip方法,...
  • Python爬虫数据

    千次阅读 2017-03-08 14:52:36
    可以看出,问题在下载/index/1时,该链接只有网页的路径部分,而没有协议和服务器部分,也就是说这是一个相对链接。由于浏览器正在浏览哪个网页,所以在浏览器浏览时,相对链接是能够正常工作的。但是,urllib2是...
  • Python爬虫

    万次阅读 2009-02-18 16:04:00
    (1)Python版简单网络爬虫 URLLister类,负责从HTML文本中根据标签提取URL,但也会提取一些垃圾URL,有待改进from sgmllib import SGMLParserclass URLLister(SGMLParser): def reset(self): 
  • 第二弹!python爬虫批量下载高清大图

    万次阅读 多人点赞 2019-10-06 12:17:20
    python爬虫绕过限制一键搜索下载图虫创意图片!中,我们在未登录的情况下实现了图虫创意无水印高清小图的批量下载。虽然小图能够在一些移动端可能展示的还行,但是放到pc端展示图片太小效果真的是很一般!建议阅读...
  • Python爬虫浅述

    2017-11-20 19:29:35
    Python作为一种解释型编程语言,在很多场景下都有应用,比如,搜索引擎,网页脚本,爬虫,网络安全等;在部分场景需要算法做支持;然而今天就总结一下简单的脚本爬虫,毕竟是在大二时期接触的Py,将近两年没碰了。在...
  • Python 爬虫 下篇

    2018-01-14 14:10:57
    Python安装 python学习 一 python语法,及变量类型 python学习 二 一个图片网站上 python学习 二 02 一个图片网站,获得主链接网址,并保存 python学习 二 03 一个图片网站-获得所有分页网址 ...
  • Python 爬虫面试题 170 道

    千次阅读 2019-07-05 12:48:21
    回答的很简单,关键的题目没有点为什么 一些复制粘贴的代码根本就跑不通 这几个问题相信大家深有体会吧,所以我决定针对市面上大多的 Python 题目做一个分析,同时也希望大家尽可能的做到举一反三,而不是局限...
  • 企查查python爬虫实例

    千次阅读 2020-03-11 14:54:22
    企查查python爬虫实例 前些日子尝试给朋友写了一个查询大批公司的统一社会信用码的爬虫程序,借助了很多网上的帖子,学习很多,现在也分享一下我用的python程序。 准备python库文件(python 3.7) import ...
  • 什么是爬虫,讲点通俗易懂的,爬虫就是爬取网页,从中按照一定规则提取信息,重复以上过程自动化重复完成的程序。 一只爬虫,第一件事情就是要爬取网页,这里主要是指获取网页的源代码。在网页的源代码里,会含有...
  • python是一种计算机的编程语言,是这么多计算机编程语言中比较容易学的一种,而且应用也广,备受大家的喜爱。这python爬虫是什么意思呢?为什么要用python写爬虫,其他的编程语言不可以吗?今天一起跟IP代理精灵去...
  • 小白学 Python 爬虫(9):爬虫基础

    千次阅读 2019-12-03 08:42:37
    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):...
  • Python爬虫中的去重处理

    千次阅读 2020-05-03 16:54:19
    Python爬虫中的去重处理一:Python爬虫去重应用场景及基本原理二:基于信息摘要算法的去重2.1 信息摘要hash算法去重方案实现2.2 去重过滤器基类实现2.3 基于set的去重过滤器2.4 基于redis无序集合的去重过滤器2.5 ...
  • Python网络爬虫案例:维基百科 1.项目描述 本案例的目标是爬取维基百科上的词条连接。爬虫深度设置为两层。 网络蜘蛛:是通过网页的链接地址寻找网页的,从网站某一个页面(通常是首页)开始读取网页的内容,找到...
  • 原标题:Python 爬虫面试题 170 ...一个是有些部分还是 Python2 的代码,另一个就是回答的很简单,有些关键的题目,也没有点为什么,最重要的是还有一些复制粘贴根本就跑不通,这种相信大家深有体会吧,这样就导致...
  • Python爬虫小试身手

    千次阅读 2016-04-16 20:35:37
    爬虫经常看到有人用Python作爬虫玩,自己也手痒痒,之前看过一些介绍,...用到的python工具主要是urllib、re、requests、BeautifulSoup之类的。懂一些html、计算机网络、正则表达式的知识就可以上路了。当然Python有个
  • Python爬虫笔试题

    2020-01-03 12:17:07
    Python爬虫笔试题 笔试题 1. 写五种http status code以及其含义。 100-消息 100-Continue,客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。 200-成功 ...
  • Python爬虫基础面试题

    2019-05-20 20:03:27
    Python爬虫基础面试题,为2019年初就业做准备 一、题目部分1、python中常用的数据结构有哪些?请简要介绍一下。python中常见的数据结构有:列表(list),字典(dict),元组(tuple),字符串(string),集合(set),数字...
  • Python爬虫代理池搭建

    万次阅读 多人点赞 2019-05-13 15:37:19
    目录 一、为什么要搭建爬虫代理池 二、搭建思路 三、代码实现 ipproxy.py settings.py ...在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制,即在某一时间段内,当某个ip的访问次数达到一定的阀值时,该...
  • python爬虫基础知识整理

    千次阅读 多人点赞 2017-11-03 10:24:52
    本文主要记录python爬虫的基础知识点,主要知识:理论基础、爬虫技能简述、实现原理和技术、uillib库和urlerror、正则、headers属性和代理服务器设置及Cookie。 1)理论基础部分 网络爬虫又称网络蜘蛛、网络蚂蚁、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,928
精华内容 7,571
关键字:

python爬出重复

python 订阅