pip -install selenium
cmd安装
仍需geckodriver配适浏览器,建议使用firefox
以下是爬虫实例,博主还不会用markdown,看官将就一下
博主尽量学习好的排版
在本实例中,待爬网页中需要下载的杂志,需要点击十年制年份范围,弹出十个年份,再次点击可得到本年期刊数据
如下结构:
2000-2010:
2000:
2001:
...
2010:
ISSUE01:
ISSUE02:
....
对于需要的400+份期刊,findway函数准确找到其所在的十年,单年,ISSUE,随后进入下载。
def ini():
profile_directory = r'C:\Users\eddatt\AppData\Roaming\Mozilla\Firefox\Profiles\XXXXXXX.default'
profile = webdriver.FirefoxProfile(profile_directory)
pythonq启动geckodriver,再启动浏览器,默认出厂配置,这里的配置文件使得网页直接下载PDF而不是在线打开
browser = webdriver.Firefox(profile)
time.sleep(5)
browser.get('THE_URL_YOU_WANT_TO_CRAWL')
time.sleep(10)
cur = browser.current_window_handle
使用句柄类进行换页操作
browser.find_element_by_link_text("Informs").click()
最重要的定位操作:有element和elements版本
time.sleep(15)
handles=browser.window_handles
handles.remove(cur)
browser.close()
browser.switch_to_window(handles[0])
return browser
def findway(num):
issuelist = [6 for i in range(65)]
issuelist[0] = 5
issuelist[1] = 5
issuelist[2] = 4
issuelist[3] = 4
issuelist[19] = 7
issuelist[28] = 7
issuelist[40] = 8
issuelist[46] = 7
issuelist[58] = 7
issuelist.reverse()
issuelist=[0]+issuelist
for i in range(66):
if(i>0):
issuelist[i]+=issuelist[i-1]
top_layer= [0,7,17,27,37,47,57,65]
top_botton=[-1,7,18,29,40,51,62]
top_reflec=[]
botton=[0,0]
botton[0]=top_botton[find(find(num,issuelist),top_layer)]
botton[1]=botton[0]+find(num,issuelist)-top_layer[find(find(num,issuelist),top_layer)]+1
return botton
def find(num,list):
for i in range(len(list)-1):
if(num>=list[i] and num return i
def click(browser,num):
botton=findway(num)
ex=browser.find_elements_by_xpath("//a[@class='title expander ']")
time.sleep(25)
if(botton[0]>0):
ex[botton[0]].click()
ex[botton[1]].click()
l=browser.find_elements_by_xpath("//span[@class='loiIssueCoverDateText']")
time.sleep(10)
l[num+6].click()
if __name__ == '__main__':
import time
载入时间模块控制进程,对于浏览器运行的每一行代码,需要时间给其反映,代码敲得太快有时网站还没有打开,浏览器还没有反映过来,就会报错,或者一动不动
from selenium import webdriver
for i in [380+j for j in range(12)]:
print(i)
browser=ini()
time.sleep(25)
click(browser,i)
time.sleep(15)
p=browser.find_elements_by_partial_link_text("PDF")
time.sleep(8)
for i in range(len(p)):
p[i].click()
time.sleep(8)
time.sleep(100)
browser.quit()
嘛,被拉着学做爬虫也有点意思的,主要是之前有过网页制作经验,知道如何定位网页元素,建议想爬虫的同志先学习一下html页面结构基础
爬虫经验总结:
1.使用chrome检查寻找网页并定位网页元素是存在风险的,检查中浏览器向服务器发送的请求开头中认为你是移动端设备,对于一些网站,电脑上显示的内容与移动端显示的内容相差很大,建议定位出错时,仔细查看网页源代码
2.网速过慢,网页反映不及,各种报错,经常使用sleep,但是time.sleep()是一个硬性的睡眠指标,固定睡一定时间。问题是:1,睡得太多,爬虫速度极低,2.睡的不够,各种报错。基于此尝试使用了隐式等待,发现并没有卵用,只能看网速和经验了,隐式等待留作一个问题
3. 定位元素可以使用class, id, xpath, element, name, value等等,但是注意定位最好选择和样式无关的指标,如果有一些网页基础就会知道,class指的是样式,很可能重复导致错误定位
爬虫感谢:
虫师,他的博客是这个,https://www.cnblogs.com/fnng/
从他的博客中学到了很多,推荐一下,但是不知道他出的书怎么样,估计也不会差
SD,爬虫元凶,并且疯狂制造错误,不过在debug中也学到不少
待解决问题:
1.隐式等待
2.浏览器状态判断交互操作
3.反反cookie反爬