最近由于工作需要开始接触爬虫,作为一个小白,真的是像个屋头苍蝇,下面主要是针对我自己遇到的问题以及解决办法做一下记录。。。
①登录网页:包含用户名、密码、验证码,获取cookie
网页源码格式:
<script type=text/javascript src=static/js/manifest.37a2ecbb1d1b7e6c9ada.js></script>
放在<script></script>之间的是文本类型(text)。
javascript是告诉浏览器里面的文本是属于javascript脚本
网上的教程 通过标签路径获取,显然这是不可行的。
from selenium import webdriver
import requests
driver = webdriver.Chrome()
driver.get("http://mydomain.com/login")
name_label = driver.find_element_by_id("clientname1")
name_label.send_keys(" ") # 防止发送不成功
name_label.clear()
name_label.send_keys(my_name)
通过查看,发现登录连接为:http://mydomain.com/api/vue/login_login?KEYDATA=myname,mg,pwd,mg,veri
KEYDATA后面是用户名、密码、验证码,显然用户名和密码是已知的,最不好得到的是验证码,
这里我用selenium模拟登录,当现实登录界面后,用
from selenium import webdriver
import requests
driver = webdriver.Chrome()
driver.get("http://domain.com/GWC/#/login")
check=input()
print(check)
url_dl = 'http://domain.com/api/vue/login_login?KEYDATA=name,mg,pwd,mg,' +check
driver.get(url_dl)
seleniumCookies = driver.get_cookies()
cookie = [item["name"] + "=" + item["value"] for item in seleniumCookies]
cookMap = ';'.join(item for item in cookie)
#把获得的cookie:seleniumCookies,放到header中
self.header['Cookie']=cookMap
②内容爬取:
登录后页面并不是直接进入要爬取内容页面,
我要爬取的内容url为:http://mydomain.com/api/vue/overhaul/getRailOverhaullistPage.do
查资料了解到:Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。不管了,我只需要知道url就行了。有了上面的cookie 就可以进行内容爬虫了
③翻页爬取
网上找了一圈,基本上都是获取下一页的连接,然后发送请求。
这里所有的数据连接都是http://mydomain.com/api/vue/overhaul/getRailOverhaullistPage.do
不同的地方是,currentPage参数不同,同时从totalPage中可以看出总共有多少页数据,currentResult中可以看出当前页有多少条记录。
那么我可以通过设置formdata的参数值来确定爬取的数据页
如何获取totalPage值来控制爬取的次数?
这里先爬取一次,获取totalPage
def parseLoginRes(self, response):
# 登录之后,开始爬取数据
yield scrapy.FormRequest(
# 钢轨大修数据,通过接口形式爬取
url="http://mydomain.com/api/vue/overhaul/getRailOverhaullistPage.do",
# 不允许页面跳转来测试
meta={'usedSelenium': False, 'dont_redirect': True},
formdata={"selectFlag": "1", "showCount": "10", "currentPage": str(1)},
headers=self.header,
callback=self.pageTurn,
errback=self.errorHandle,
dont_filter=True
)
然后再进行while循环爬取。
def pageTurn(self,response):
self.totalpage = json.loads(response.text)['data']['page']['totalPage'] # 获取总共有多少页需要爬取
self.currentpage = 1
while True: # spider 获取输入的response 并且
if self.currentpage > self.totalpage:
break
yield scrapy.FormRequest(
# 钢轨大修数据,通过接口形式爬取
url="http://mydomain.com/api/vue/overhaul/getRailOverhaullistPage.do",
# 不允许页面跳转来测试
meta={'usedSelenium': False, 'dont_redirect': True},
formdata={"selectFlag": "1", "showCount": "10", "currentPage": str(self.currentpage)},
headers=self.header,
callback=self.parseLoginStatusRes,
errback=self.errorHandle,
dont_filter=True
)
self.currentpage += 1
④导入自定义py文件,总是现实不存在,
import sys
sys.path.append(r"file_path")#指定自定义模块的位置
import file_name
这样就不会有问题了,
如果是上级目录中文件:
import sys
import os
sys.path.append(os.path.dirname(__file__) + os.sep + '../') #将下面的相对路径转化为绝对路径
from ..items import SpiderrailItem