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元素值,
单一属性定位:
定位属性 | 定位代码 |
---|---|
type | driver.find_element_by_css_selector(‘input’) |
id | driver.find_element_by_css_selector(’#kw’) |
class | driver.find_element_by_css_selector(’.s_ipt’) |
其他属性 | driver.find_element_by_css_selector(‘span[id$=‘No’]’) |
组合属性定位:
定位属性 | 定位代码 |
---|---|
id | driver.find_element_by_css_selector(“input#kw”) |
class | driver.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 | 最后一个标签 |
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()