两个综合案例:
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))