反爬策略: 1.通过usse_agent客户端标识来判断是否是爬虫 解决办法:封装user_agent请求头 2.通过访问频率来判断 解决办法:设置爬取时间 3.封ip 解决办法:设置代理 4.页面内容无法直接获取数据,页面都是js代码 解决办法:selenium+phantomjs
常见的一些页面技术:
js html是页面的骨架,css是页面装饰,js是页面灵魂 jquery jquery是一个js库,可以是js代码更加简化。 ajax web页面的异步请求,是一种技术。解决方法:selenium+phantomjs
1. selenium:是web自动测试工具,但自身不带浏览器 pantomjs:他是一个无界面的浏览器。所以他可以运行js代码,帮我们拿到页面数据 2.安装: selenium安装 pip install selenium==2.48.0 pantomjs安装 是第三方插件,搜索phantomjs镜像,下载后将exe文件复制,放到运行环境的scrip文件下面(注意:第三方插件都可以放在script文件下) 例子: import requests,time from lxml import etree from selenium import webdriver #https://search.douban.com/book/subject_search?search_text=python&cat=1001&start=30 base_url = 'https://search.douban.com/book/subject_search?search_text=python&cat=1001&start=%s' headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36' } driver=webdriver.PhantomJS() #创建一个浏览器驱动 def get_text(text): if text: return text[0] return '' def parse_page(text): html=etree.HTML(text) div_list=html.xpath('//div[@id="root"]/div/div/div/div/div') for div in div_list: item = {} ''' 图书名称 评分 评价数 详情页链接 作者 出版社 价格 出版日期 ''' name=get_text(div.xpath('.//div[@class="title"]/a/text()')) scores=get_text(div.xpath('.//span[@class="rating_nums"]/text()')) comment_num = get_text(div.xpath('.//span[@class="pl"]/text()')) detail_url = get_text(div.xpath('.//div[@class="title"]/a/@href')) if all([name,detail_url]): #两个都为真 item['name'] = name item['scores'] = scores item['comment_num'] = comment_num item['detail_url'] = detail_url print(item) if __name__=="__main__": for i in range(1): driver.get(base_url %(i * 50)) #等待 time.sleep(2) html_str=driver.page_source #获取页面的内容 parse_page(html_str)