python | 尝试爬虫 xpath

python | 尝试爬虫 xpath,第1张

整理一下自己的笔记
是根据b站up主 大大的小番茄 的教程来看的,非常适合很新很新的新手。

首先要明白爬虫的思路:请求获取网页IP,根据已知的IP获取服务器返回的HTML,找到HTML里面自己需要的信息。

第一部分:HTML
大部分网页的构成分为三个部分:HTML(相当于骨架)、CSS(定义了外观)、JScript(表示功能)。爬虫主要针对的是HTML。

看到的HTML内容的<>称为标签。
常见的标签如下:

标签用法或意义
中间的元素是网页
用户可见内容
框架

段落
  • 列表
    图片
    超链接
    • 其中一些成对出现的标签称为闭合标签,比如 ,也就是<>成对出现的。
    • 另外一些称为自闭和标签,比如 ,只有一个尖括号,没有与之对应的。

    标签里都有一些标签的属性,比如id、style、class等等,标签拥有层级关系。

    一个例子:

    PS.关于URL
    简而言之,就是网址。
    http协议——端口80
    https协议——端口443
    这部分视频非常详细地简单阐述了一下,感兴趣或者有需要的可以看看。

    第二部分:python中模拟请求的库
    要注意的是:python访问HTML的时候会被拒绝,因此需要“伪装”成一个用户在浏览,因此需要修改头参数(user-agent),还要注意refer、cookie,这部分直接复制粘贴相应的代码即可。

    requests库

    import requests
    
    url = "https://www.baidu.com/"	# 想要访问的网址
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/91.0.4472.101 Safari/537.36''cookie': '....'}
    # 伪装成浏览器
    response = requests.get(url, headers=headers)	# 响应一个HTML文件
    # print(type(response)) 
    # 如果查看response的类型会发现得到的是 
    # 如果想查看到具体的HTML内容可以 print(response.text) 得到的东西看起来像乱码,是因为解析网站内容的编码问题(utf8),那么只要指定编码方式来解析就可以看到了
    content = response.content.decode('utf-8')
    
    

    如何查看一个网页的编码格式?
    查看网页HTML的里面的
    或者在控制台(console)输入 document.charset
    或者直接在python中查询response.encoding

    第三部分:数据提取Xpath
    数据提取方式:Xpath、beautifulsoup4、正则匹配
    (这里有一个正则匹配的网站我个人觉得很好用:正则)

    使用Xpath的目的是找到数据的路径,这里分两部分记录,
    第一钟方法,或者说最简单的方法:直接复制Xpath路径。

    第二种方法,需要理解一下Xpath的语法:
    Xpath语法:

    用法说明
    表达式 选取细节点的所有子节点 如div选取div下的所有标签
    //,如//div选取整个HTML页面的所有div标签
    /,如//head/title选取head标签下的title标签
    @,如//div[@id]选取带有id属性的div标签
    . ,如./span选取当前节点下的span标签

    另外Xpath的语法很丰富,还有一些别的语法,比如通配符、提取属性内容等等,此处略。
    (找路径:浏览器 shift+CTRL+C)
    (这个地方也可以用一些插件辅助自己找路径)

    第四部分:lxml
    由于Xpath只能作用于HTML文件而无法作用于content(前文python代码中将HTML转存为content,但其本质上是字符串而不是真正的HTML),所以需要lxml库将其还原为真正的HTML文件供Xpath使用。

    使用lxml中的etree对html进行处理:

    将字符串转为HTML:

    from lxml import etree
    
    html = etree.HTML(string)		# 将字符串转为HTML
    

    找到想要的东西:

    divs = html.xpath('//div')		# 找到HTML中的所有div元素
    
    for div in divs:
    	d = etree.tostring(div,encoding='utf8').decode('utf8')
    	# HTML是无法直接print的,所以要用 utf8 解析并且转化为字符串
    	print(d)					# 把找到的元素展示出来
    
    # 或者
    divs = html.xpath('//div//text()')	# divs是list类型
    print(divs)
    # 实际 *** 作的时候发现上面的运行不了总是有TypeError: Type 'list' cannot be serialized.报错
    # 后来使用了下面的代码可以运行成功
    # 要注意的是//text(),我看其他人的教程都是/text(),后者我没有运行成功
    

    我的代码:

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/91.0.4472.101 Safari/537.36',
        'Cookie': "xhsTrackerId=db9b893f-c57e-4b75-cb2d-8a01dc3e2ef9; customerClientId=718184282725177; "
                  "timestamp2=20220416ac00c9ab7cf224aab55b56f7; "
                  "timestamp2.sig=Uis941-HUqopB8oy944WYrzE1Ffv09eCLwRzd5GD080; "
                  "xhsTracker=url=noteDetail&searchengine=baidu; extra_exp_ids=recommend_comment_hide_clt1,"
                  "supervision_exp,supervision_v2_exp,commentshow_exp1,gif_clt1,ques_clt2"}
    
    url = 'https://www.xiaohongshu.com/discovery/item/625d43e900000000010256e0'
    response = requests.get(url, headers=headers)
    # print(type(response))
    # print(response.encoding)  # 查看编码方式
    # print(response.status_code)  # 响应码为200,说明正常相应
    content = response.content.decode('utf-8')
    print(type(content))
    # print(content)
    # with open("text.html", "w", encoding='utf-8') as f:
    # f.write(content)
    html = etree.HTML(content)
    # print(type(html))
    wenan = html.xpath('//*[@id="app"]/div/div[2]/div[1]/main/div//text()')  # 类型为list
    print(wenan)
    

    到这里就可以得到内容了
    PS.要注意一些反爬虫会封IP:可以多用几个user-agent,具体方法可查看其他人的文章

    第五部分:导出数据
    读取excel文件:xlrd库
    写出excel文件:xlwt库

    workbook = xlwt.Workbook(encoding='utf8')       # 新建一个excel,编码方式为utf8
    sheet = workbook.add_sheet('text')              # 在excel里面新建sheet,sheet名称为text
    
    text.write(0,0,'name')		# 在“text”的sheet下的(0,0)位置(也就是A1)处写入“name”
    # 如果要批量写入那就加循环就好了
    
    workbook.save("C:\Users\zhang\Desktop\新建 XLSX 工作表.xlsx")
    # 保存在你想保存的对应路径下的文件中
    # 一个找路径的小tip:shift+鼠标右键
    
    

    很惭愧我是结果导向才学的爬虫,希望以后有机会把后面的教程看完,继续这个笔记。

    欢迎分享,转载请注明来源:内存溢出

    原文地址: https://outofmemory.cn/langs/725844.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-04-26
    下一篇 2022-04-26

    发表评论

    登录后才能评论

    评论列表(0条)

    保存