3.xpath以及selenium使用
xpath
处理网页:pip install lxml
from lxml import etree
# 网页的源码
html_doc = resp.content.decode('utf-8')
# 使用etree去转换html_doc,转换成了一个html对象,此时element对象可以使用xpath语法
html = etree.HTML(html_doc)
print(html.xpath("xpath语法")
xpath语法
xpath语法中,[1]就是第一个
# 当前html页面中所有的a标签
//a
# 当前html页面中所有a标签中的href的属性内容
//a/@href
# 当前html页面中所有a标签中的文本内容
//a/text()
# 拿到所有img标签中的src属性的内容
//img/@src
# 拿到所有a标签下面的所有img标签中的src内容
//a//img/@src
# 选择img标签中alt是某个值的标签并且提取src值
//img[@alt='猪猪侠之南海日记2']/@src
# 选取页面中所有div并且class是lst-item的,选择其中第3个,并且在此之下,选择第4个a标签中的img标签的src属性内容
//div[@class='lst-item'][3]/a[4]/img/@src
# 这里的a标签是选择最后一个
//div[@class='lst-item'][1]/a[last()]/img
# a标签倒数第二个
//div[@class='lst-item'][1]/a[last()-1]/img
# 查找所有p标签中,文字内容是xxx的
//p[text()='超变武兽第二季']
# 查找所有p标签中,包含某些文字的
//p[contains(text(),'蜡笔')]
# 页面中所有p标签凡是带有属性的内容都选出来
//p[@*]
# 这里的*代表选择所有的元素
//div[@class='lst-item'][2]/*
# 选择页面中所有class是m-lst的div中的第4个div
//div[@class='m-lst']/div[position()=4]
爬虫小实战
import requests
from lxml import etree
# 页面内的爬虫
def scrapy(url):
url = url
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}
resp = requests.get(url=url, headers=headers)
# 网页的源码
html_doc = resp.content.decode('utf-8')
# 使用etree去转换html_doc,转换成了一个html对象,此时element对象可以使用xpath语法
html = etree.HTML(html_doc)
dongman_title = html.xpath("//div[@class='u-ct']/p[@class='u-tt']/text()")
dongman_pic = html.xpath("//div[@class='lst']/a/img/@data-src")
print(dongman_title)
print(dongman_pic)
# 发现下一页
def find_next_page(url):
url = url
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}
resp = requests.get(url=url, headers=headers)
# 网页的源码
html_doc = resp.content.decode('utf-8')
# 使用etree去转换html_doc,转换成了一个html对象,此时element对象可以使用xpath语法
html = etree.HTML(html_doc)
# 获得下一页的链接
next_page = html.xpath("//a[contains(text(),'下一页')]/@href")
# 创建完整的链接
really_next_page = "http://www.4399dmw.com" + next_page[0]
return really_next_page
def main():
url = "http://www.4399dmw.com/search/dh-1-0-0-0-0-0-0/"
while True:
try:
print("开始爬行url:"+url)
scrapy(url)
page_url = find_next_page(url)
url = page_url
except:
print("The last page has been done")
break
if __name__ == '__main__':
main()
反爬虫
通过User-Agent判断?随机生成user-agent反反爬虫
version_id = random.randint(50,120)
os_type = ['Windows NT 10.0','Windows NT 6.1','Linux 10.0']
# 法一:使用+连接
ua = "Mozilla/5.0 ("+random.choice(os_type)+"; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758."+str(version_id)+" Safari/537.36"
# 法二:使用join函数连接
ua = "".join(["Mozilla/5.0 (",random.choice(os_type),"; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.",str(version_id)," Safari/537.36"])
通过Referer判断?传入合法的随机的referer
referer = f"http://www.4399dmw.com/search/dh-1-0-0-0-0-{random.randint(1,14)}-0/"
通过Cookie判断?建立cookie池(爬虫批量建立多账户)
通过ip?使用代理ip等方法
验证码?考虑写程序(机器学习,神经网络)识别验证码,打码平台
通过自定义字体?
1.有的网站通过审查元素字体无法显示,显示为口?考虑使用手机网络访问
2.通过字体偏移(标准字体库和本身字体库有偏移,前端显示使用CSS偏移选择字)?找出规律对爬虫修改
selenium
直接控制浏览器的插件,配合各种语言做爬虫
安装:pip install selenium
web自动化测试工具:https://npm.taobao.org
chromedriver:https://vikyd.github.io/download-chromium-history-version/#/
先下载chrome-win.zip,再下载chromedriver_win32.zip
chrome-win为浏览器主程序,同chromedriver解压到python代码同文件夹下
如果调用自己需要chrome版本和chromedriver版本一致