爬虫笔记五

两个综合案例:
1.代理池
池思想
元类
2.ajax综合
qq音乐下载。

项目的分类。

==============================================================
1、爬取网站的流程:
1、确定网站哪个url是数据的来源。
2.简要分析一下网站结构,查看数据一般放在哪里。
3.查看是否有分页,解决分页的问题。
4.发送请求,查看response.text里面是否有我们想要的数据内容。
5.如果有数据,就用相应的提取数据的方法提取数据保存。

2、注意事项:
刚开做爬虫项目,先不要用类去做,只需要关注数据的来源等问题的解决,不要关注类结构的设计。

3、可迭代对象和迭代器:
可迭代对象就是有__iter__属性的对象

迭代器:有__next__属性的对象

两个能转化吗:
	iter(可迭代对象)-----》迭代器。
	
可迭代对象有哪些:
	
	list
	dict
	tuple
	str
	bytes
	set
	迭代器
	生成器
	文件流


如何打印一个文件同时输出行号。
fp = open(‘shabei_spider.py’,‘r’,encoding=‘utf-8’)
print(fp)
#如何输出行号。
for i,c in enumerate(fp,1):
print(i,c)

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))








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值