爬虫遇到的问题以及解决办法

最近由于工作需要开始接触爬虫,作为一个小白,真的是像个屋头苍蝇,下面主要是针对我自己遇到的问题以及解决办法做一下记录。。。

登录网页:包含用户名、密码、验证码,获取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
 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值