python爬虫

本文介绍了一种使用requests、lxml及selenium等工具进行网页爬取的方法,详细讲解了如何构造请求、解析网页内容及自动翻页等核心步骤,并提供了一个具体的商品信息爬取实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.一般爬取路径

requests读取网站,lxml的etree解析,xpath提取信息
requests+lxml+xpath

2.requests

2.1读取文件

data可以调整参数,从而翻页

ss=requests.Session()

可以创建会话,进而

content=ss.get(url,headers,data).text

一般headers目前用到的只有修改User-Agent
若有较多循环,可以通过

import time
time.sleep(2) # 代表间隔2s

在requests.get前,来避免因较高频率爬取数据的反爬机制

2.2出现了proxy_error

两种解决办法:

ss=requests.Session()
ss.trust_Env=False

或者

proxies = { "http": None, "https": None} 
requests.get(url, proxies=proxies) 

3.lxml

from lxml import etree
content=ss.get(url,headers=headers,data=data).text
# 使用lxml构造文档对象模型DOM
html=etree.HTML(content)
print(etree.tostring(html,pretty_print=True,encoding="utf-8").decoding("utf-8"))

来解析包含有中文的文档

4.xpath

对DOM文档进行分析,//默认从根目录开始,即使

str.xpath('//div/*')

也是从根目录开始,在引号最前面应该加入.表示匹配当前路径,如:

tr.xpath("./td[8]/span/text()")[0]

5.selenium

import selenium
from selenium import webdriver
driver=webdriver.Chrome()

便捷实现自动翻页,通过selenium.webdriver对页面进行操作,注意得到的都是元素

5.1得到属性值或值:

driver.find_element().get_attribute('value')
driver.find_element().text

而xpath是在引号内的路径末尾加上/text()即可
定位代码:

driver=selenium.webdriver.Chrome() # 以谷歌为例
# 找单个元素用element;多个元素elements,得到list,可如list[i]进行引用
driver.find_element_by_xpath('//*[@id="btnGoToNum]"/@value')
driver.find_element_by_css_selector('a[id $= "No"]')

find_element_by_css_selector很方便,在搜索值时可以用到正则表达式:

正则表达含义
a[id$=‘No’]其最末尾字符为No的所有a元素
a[id^=‘No’]以No开头的字符的所有a元素
a[id*=‘No’]其id属性包含No的所有a元素

如果id定位,在字符前赋#表示id元素值,
单一属性定位:

定位属性定位代码
typedriver.find_element_by_css_selector(‘input’)
iddriver.find_element_by_css_selector(’#kw’)
classdriver.find_element_by_css_selector(’.s_ipt’)
其他属性driver.find_element_by_css_selector(‘span[id$=‘No’]’)

组合属性定位:

定位属性定位代码
iddriver.find_element_by_css_selector(“input#kw”)
classdriver.find_element_by_css_selector(“input.s_ipt”)
其他属性driver.find_element_by_css_selector(“input[name=‘wd’]”)
其他属性driver.find_element_by_css_selector(“input[name]”) 仅有属性名也可
多个属性联合定位driver.find_element_by_css_selector(“input[name=‘you’][auto=‘yes’]”)

层级定位:
>表示层级关系的递进(不可跳级),用空格分隔也可表示递进(可跳级)
driver.find_element_by_css_selector(’#u_sp > a:nth-child(1)’)表示id为u_sp的下面的第一个a标签

*:nth-child(n)含义
*:nth-child(i)第i个标签
*:nth-last-child(i)倒数第i个标签
*:first-child第一个标签
*.last-child最后一个标签

参考:css_selector定位详解,css参考手册

5.2点击翻页

1.首先要找到下一页的入口并点击:

driver.find_element_by_xpath('//*[@id="btnGoToNum"]/@value/..').click()

2.输入下一页页码,回车:

from selenium import Keys
temp=driver.find_element_by_css_selector('input[name="txtToPageNum"]')
temp.clear()
temp.send_keys(str(2))
temp.send_keys(Keys.ENTER)

实操代码

import requests
from lxml import etree
import re
get_url = 'https://www.anpel.com.cn/Searchnew.aspx?Types=6&Type=0&KeyWord=CDCT'
uagent= 'In case of privacy, remain my personal information under cover here.'

headers = {
    'User-Agent': uagent
}

#使用requests访问网页,获取第1页内容
ss = requests.Session()
content = ss.get(url=get_url, headers=headers).text

#使用lxml构造文档对象模型DOM
html = etree.HTML(content)
#查看抓取的页面中是否含有商品信息
print(etree.tostring(html,pretty_print=True,encoding="utf-8").decode("utf-8"))
#your codes
import time
import selenium
from selenium import webdriver
need=[]
class anpel(object):
    def __init__(self):
        self.start_url=get_url
        self.driver=webdriver.Chrome()
    def __del__(self):
        self.driver.quit()
    def get_content(self):
        print("I can do it!")
        time.sleep(20)
        item={}
#         ciyain=self.driver.find_element_by_css_selector('input[name="txtToPageNum"]')
#         ciyain.clear()
#         ciyain.send_keys(str(i))abs
#         ciyain.send_keys(Keys.ENTER)
        
        # 定位到进入下一页的入口
        a=self.driver.find_element_by_xpath('//*[@id="btnGoToNum"]/@value/..')
        tr_list = self.driver.find_elements_by_xpath("//table[@id='gridview']/tbody/tr")[1:]
        products=[]      #存放抓取的产品信息
        if len(tr_list):
            for tr in tr_list:
                item = {}
                # 商品编号、商品名称
                ### 问题3: 获取商品编号与名称存放在字典item的键id与name中 
                item['id']=tr.find_element_by_css_selector("a[id $= 'No']").get_attribute('title')
                item['name']=tr.find_element_by_css_selector("a[id $= 'Name']").get_attribute('title')

                # CAS号(Chemical Abstracts Service,文献中物质编号)
                ### 问题4:获取商品CAS号,存放在典item的键CAS中,注意网页中如无该值,则设为空 
                item['CAS'] = tr.find_element_by_css_selector("span[id $= 'No']").get_attribute('title')

                # 品牌
                item['brand'] = tr.find_element_by_css_selector("span[id $= 'BrandName']").get_attribute('title')
                # 规格型号
                item['model'] = tr.find_element_by_css_selector("span[id $= 'Spec']").get_attribute('title')

                # 标准价
                ### 问题4:获取商品价格,存放在典item的键price中,注意网页中如无该值,则设为空 
                item['price'] = tr.find_element_by_css_selector("span[id $= 'Price']").text

                # 货期
                item['LeadTime'] = tr.find_element_by_css_selector("span[id $= 'TotalQtyMeo1']").text

                # 将获取的一条产品信息加入列表
                products.append([str(item['id']),str(item['name']),str(item['CAS']),str(item['brand']),str(item['model']),
                                            str(item['price']),str(item['LeadTime'])])
#         self.driver.find_element_by_xpath('//*[@id="btnGoToNum"]/@value/..').click()
        return a,products
    def run(self):
        self.driver.get(self.start_url)
#         i=1
        while True:
#             if i==19:
#                 break
            a,products=self.get_content()
            need.append(products)
#             i=i+1
            if self.driver.find_element_by_xpath('//*[@id="txtToPageNum"]').get_attribute('value')=='1':
                break
            a.click()
if __name__=="__main__":
    ciyatry=anpel()
    ciyatry.run()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值