因为百度很好地遵守了淘宝网的robots.txt协议,自然,你在百度中也查不到淘宝网的具体商品信息了
【网页头】中的编码是没办法在网页中直接被看到的,标签页的内容也不属于网页的正文而
元素中,即【网页体】,就是那些能看到的显示在网页中的内容了网页体中依次有四个内容:
元素代表一级标题,对应网页中的“豆瓣2019年度电影榜单”;元素代表三级标题,对应网页中的“评分最高华语电影”;元素代表二级标题,对应网页中的“《少年的你》”;然后是
元素代表二级标题,对应网页中的“《少年的你》”;然后是
元素,对应网页中“根据玖月晞小说......的故事”这一整段文本5.属性HTML标签可以通过设置【属性】来为HTML元素描述更多的信息
text获取到的是该标签内的纯文本信息,即便是在它的子标签内,也能拿得到。但提取属性的值,只能提取该标签本身的在爬豆瓣的时候遇到status_code为418的情况,解决办法是在request.get()时加个头安装fake-useragent模块,在终端输入pip3installfake-useragent
importrequestsfromfake_useragentimportUserAgentua=UserAgent()#实例化headers={'User-Agent':ua.random}#也可以是ua.ie,ua.chrome,ua.safari等res=requests.get(url,headers=headers)quote()实现url编码↓
fromurllib.requestimportquote,unquote#quote()函数,可以把内容转为标准的url格式,作为网址的一部分打开print(quote('海边的卡夫卡'))#》》E6%B5%B7%E8%BE%B9%E7%9A%84%E5%8D%A1%E5%A4%AB%E5%8D%A1#unquote()函数,可以转换回编码前数据print(unquote('%E6%B5%B7%E8%BE%B9%E7%9A%84%E5%8D%A1%E5%A4%AB%E5%8D%A1'))#》》海边的卡夫卡也可以↓
可以看到变化的是这个p参数,第1页XHR的参数p值为1,第2、3页XHR的参数p值则为2和3,说明在这个client_search_cp..的请求中,代表页码的参数是p(page的缩写)通过循环变更链接中的p参数就可以拿到更多歌曲信息,但这样的代码不够优雅事实上,requests模块里的requests.get()提供了一个参数叫params,可以用字典的形式,把参数传进去所以可以把QueryStringParameters里的内容,直接复制下来,封装为一个字典,传递给params。只是有一点要特别注意:要给他们打引号,让它们变字符串
a='你\\n好\\n么\\n'b=a.replace('\\n','\n')print(a)#》》你\n好\n么\nprint(b)#》》你#》》好#》》么replace()是字符串对象的一个方法,它的意思是,把第一个参数的字符串用第二个参数的字符串替代
常用的存储数据的方式有两种——存储成csv格式文件、存储成Excel文件csv是一种字符串文件的格式,它组织数据的语法就是在字符串之间加分隔符——行与行之间是加换行符,同行字符之间是加逗号分隔它可以用任意的文本编辑器打开(如记事本),也可以用Excel打开,还可以通过Excel把文件另存为csv格式(因为Excel支持csv格式文件)
一个Excel文档也称为一个工作薄(workbook),每个工作薄里可以有多个工作表(worksheet),当前打开的工作表又叫活动表每个工作表里有行和列,特定的行与列相交的方格称为单元格(cell),比如上图第A列和第1行相交的方格可以直接表示为A1单元格openpyxl模块需要安装,mac电脑在终端输入命令:pip3installopenpyxl
Excel读取↓
获取到了字符串格式的网页源代码之后,就可以用BeautifulSoup解析和提取数据了4.自动操作浏览器
1.schedule通过第三方库schedule实现定时功能标准库一般意味着最原始最基础的功能,第三方库很多是去调用标准库中封装好了的操作函数。比如schedule,就是用time和datetime来实现的对于定时功能,time和datetime当然能实现,但操作逻辑会相对复杂,而schedule可以直接解决定时功能,代码比较简单schedule需要先安装,mac电脑在终端输入:pip3installschedule
importscheduleimporttimedefjob():print("I'mworking...")schedule.every(10).minutes.do(job)#部署每10分钟执行一次job()函数的任务schedule.every().hour.do(job)#部署每×小时执行一次job()函数的任务schedule.every().day.at("10:30").do(job)#部署在每天的10:30执行job()函数的任务schedule.every().monday.do(job)#部署每个星期一执行job()函数的任务schedule.every().wednesday.at("13:15").do(job)#部署每周三的13:15执行函数的任务whileTrue:schedule.run_pending()time.sleep(1)2.定时发送天气情况
importscrapyimportbs4导入scrapy是待会要用创建类的方式写这个爬虫,所创建的类将直接继承scrapy中的scrapy.Spider类。这样,有许多好用属性和方法,就能够直接使用在Scrapy中,每个爬虫的代码结构基本都如下所示↓
importscrapy#导入scrapyclassDoubanItem(scrapy.Item):#定义一个类DoubanItem,它继承自scrapy.Itemtitle=scrapy.Field()#定义书名的数据属性publish=scrapy.Field()#定义出版信息的数据属性score=scrapy.Field()#定义评分的数据属性导入了scrapy,目的是,等会所创建的类将直接继承scrapy中的scrapy.Item类。这样,有许多好用属性和方法,就能够直接使用。比如到后面,引擎能将item类的对象发给ItemPipeline(数据管道)处理然后定义了一个DoubanItem类,它继承自scrapy.Item类之后的代码是定义了书名、出版信息和评分三种数据。scrapy.Field()这句代码实现的是,让数据能以类似字典的形式记录。举例看下↓
importscrapy#导入scrapyclassDoubanItem(scrapy.Item):#定义一个类DoubanItem,它继承自scrapy.Itemtitle=scrapy.Field()#定义书名的数据属性publish=scrapy.Field()#定义出版信息的数据属性score=scrapy.Field()#定义评分的数据属性book=DoubanItem()#实例化一个DoubanItem对象book['title']='海边的卡夫卡'book['publish']='[日]村上春树/林少华/上海译文出版社/2003'book['score']='8.1'print(book)print(type(book))#》》{'publish':'[日]村上春树/林少华/上海译文出版社/2003',#》》'score':'8.1',#》》'title':'海边的卡夫卡'}#》》
importscrapyclassJobuiItem(scrapy.Item):#定义了一个继承自scrapy.Item的JobuiItem类company=scrapy.Field()#定义公司名称的数据属性position=scrapy.Field()#定义职位名称的数据属性address=scrapy.Field()#定义工作地点的数据属性detail=scrapy.Field()#定义招聘要求的数据属性5.创建和编写spiders文件在spiders文件夹下创建爬虫文件,命名为jobui_jobs.py在Scrapy里,获取网页源代码这件事儿,会由引擎分配给下载器去做,不需要自己处理。之所以要构造新的requests对象,是为了告诉引擎,新的请求需要传入什么参数,这样才能让引擎拿到的是正确requests对象,交给下载器处理构造了新的requests对象,就得定义与之匹配的用来处理response的新方法。这样才能提取出想要的招聘信息的数据
FEED_URI='./storage/data/%(name)s.csv'FEED_FORMAT='CSV'FEED_EXPORT_ENCODING='utf-8'FEED_URI是导出文件的路径。'./storage/data/%(name)s.csv',就是把存储的文件放到与scrapy.cfg文件同级的storage文件夹的data子文件夹里FEED_FORMAT是导出数据格式,写CSV就能得到CSV格式FEED_EXPORT_ENCODING是导出文件编码,utf-8是用在mac电脑上的编码格式,写ansi是一种在windows上的编码格式存储成Excel文件的方法,需要先在settings.py里设置启用ITEM_PIPELINES,设置方法只要取消ITEM_PIPELINES的注释(删掉#)