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版本一致