两个综合案例: 1.代理池 池思想 元类 2.ajax综合 qq音乐下载。
项目的分类。
============================================================== 1、爬取网站的流程: 1、确定网站哪个url是数据的来源。 2.简要分析一下网站结构,查看数据一般放在哪里。 3.查看是否有分页,解决分页的问题。 4.发送请求,查看response.text里面是否有我们想要的数据内容。 5.如果有数据,就用相应的提取数据的方法提取数据保存。
2、注意事项: 刚开做爬虫项目,先不要用类去做,只需要关注数据的来源等问题的解决,不要关注类结构的设计。
3、可迭代对象和迭代器: 可迭代对象就是有__iter__属性的对象
迭代器:有__next__属性的对象 两个能转化吗: iter(可迭代对象)-----》迭代器。 可迭代对象有哪些: list dict tuple str bytes set 迭代器 生成器 文件流1.反爬措施以及应对措施。 反爬策略: (1)通过use-agent客户端标识来判断是否是爬虫 解决的办法:封装use-agent请求头。 (2)通过访问频率来判断。 解决的办法:设置爬取间隔。 a = random.randint(5) time.sleep(a) (3)封ip 解决的办法:设置代理ip (4)页面内容无法直接获取数据,页面都是js代码。 selenium+phantomjs可以获取页面数据。
xpath://div[@class=“abc”]/p[@id=“p1”] css选择器:div.abc p #p1
2.动态Html页面的处理方法。 常见的一些页面技术: (1)js html使我们页面的骨架,css是页面装饰,js是页面的灵魂。 (2)jquery jquery是一个js库,可以是js代码更加简化。 (3)ajax:web页面的异步请求,是一种技术。 (4)DHTML 3.selenium+phantomjs就可以处理这种问题。 (1)selenium:他是web自动测试工具。 pantomjs:他是一个无界面的浏览器。所以他可以运行js代码,帮我们拿到页面数据。 所以selenium+phantomjs就可以解决页面是js代码的这种网站数据的获取问题。 (2)selenium和phantomjs的下载 pip install selenium==2.48.0 百度phantomjs镜像 (3)phantomjs环境变量的配置: 有第三方插件的,都可以放在anaconda/scripts文件下面。 (4)chromedriver chromedriver镜像,注意和自己的chrome浏览器版本对应。 4.ajax请求的项目
作业: 1、酷狗音乐的歌手信息。
import json import time import requests from lxml import etree from custom import headers class Kugou: def __init__(self,url): self.base_url = url self.result = {} # self.proxies = { "http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080", } self.headers = { 'cookie': 'kg_mid=d61b7926b74e98cfd59502fe8b816d43; ' 'Hm_lvt_aedee6983d4cfc62f509129360d6bb3d=1572529211; ' 'Hm_lpvt_aedee6983d4cfc62f509129360d6bb3d=1572529211;' 'ACK_SERVER_10016=%7B%22list%22%3A%5B%5B%22gzreg-user.kugou.com%22%5D%5D%7D; ' 'ACK_SERVER_10015=%7B%22list%22%3A%5B%5B%22gzlogin-user.kugou.com%22%5D%5D%7D;' 'ACK_SERVER_10017=%7B%22list%22%3A%5B%5B%22gzverifycode.service.kugou.com%22%5D%5D%7D; ' 'kg_dfid=07Gd5J4MWDo70XbXtw3qfEoE; ' 'kg_dfid_collect=d41d8cd98f00b204e9800998ecf8427e', 'referer': 'https://www.kugou.com/yy/singer/index/1-a-1.html', 'User-Agent': 'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)' } self.get_res() def try_get(self,lst): if lst: return lst[0] def get_xpath(self,url, xrl): # print(url) response = requests.get( url, headers=headers ) tree = etree.HTML( response.text ) return tree.xpath( xrl ) def get_res(self): A_href_xpath = '//ul[@id="list_head"]/li/strong/a/@href|//div[@id="list1"]/ul/li/a/@href' # href lst_wd = [chr(i + ord('a')) for i in range(26)] lst_wd.append('null') for word in lst_wd: for i in range( 1, 6 ): self.headers['referer']=url %(i,word) # print(i) # time.sleep(2) A_href_list_one = self.get_xpath( url %(i,word), A_href_xpath ) # print(A_href_list_one) for j in A_href_list_one: # # print(j) pic_xpath = '//div[@class="sng_ins_1"]/div[@class="top"]/img/@_src' intro_xpath = '//div[@class="intro"]/p/text()' name_xpath = '//div[@class="sng_ins_1"]/div[@class="top"]/img/@alt' name = self.try_get( self.get_xpath( j, name_xpath ) ) # print(name) pic = self.try_get(self.get_xpath(j,pic_xpath)) print(pic) intro = self.try_get( self.get_xpath( j, intro_xpath ) ) # print(intro) # # time.sleep(1) self.result[name] = { 'photo':pic, 'introduction': intro, 'url': j } with open( 'result/kugou.txt', 'w', encoding='utf-8' ) as fp: fp.write( str( self.result ) ) return self.result if __name__ == '__main__': url = 'https://www.kugou.com/yy/singer/index/%s-%s-1.html' kugou = Kugou(url) with open('result/kugou.json','w',encoding='utf-8') as fp: json.dump(kugou.result,fp) with open('result/kugou.txt','w',encoding='utf-8') as fp: fp.write(str(kugou.result))