利用python爬虫进行一个网站的信息搜索,requests返回代码为200,但是爬取的数据不正常,似乎都是同一页,翻页请求是不是被禁止了,我该如何解决

我想要用python爬虫重复获取网站信息,但爬不出东西,这个问题之前不存在,直到我在同一个网站翻页100页,没有设置停顿之后,就出现了网页请求访问正确,但是网站的数据似乎爬不下来了,数据只有第一页的,后面的页无法爬取。

img

img

代码如下,有人能帮忙看看,运行一下并告诉我什么原因吗,能帮我解决,有偿答谢
# -*- coding:utf-8 -*-

import time
import xlwt
import xlrd
import re
import requests
from bs4 import BeautifulSoup

findZclx = re.compile(r'<td class="zclx_lw textcenter">(.*?)</td>')
findLink = re.compile(r'href="(.*?)"')
findTitle = re.compile(r'>(.*?)</a>')
findDate = re.compile(r'<td class="textcenter">(.*?)</td>')

header = {
    "User-Agent": '"Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9"'
}

number = 0
Keyword = ""

savepath1 = "筛选信息.xls"
dr = xlrd.open_workbook(savepath1)
table = dr.sheet_by_index(0)
KeyWords = table.col_values(0)
del KeyWords[0]


def main():
    baseurl = 'http://www.crpsz.com/zbxx/006001/secondpagejy.html?categoryNum=006001&pageIndex='
    for KeyWord in KeyWords:
        global Keyword
        Keyword = KeyWord
        savepath = Keyword + "招标信息.xls"
        datalist = askDATA(baseurl)
        SavePath(savepath, datalist)


def askDATA(baseurl):
    global number
    global Keyword
    number = 0
    datalist = []
    for i in range(1, 20):
        url = baseurl + str(i)
        time.sleep(3)
        page = requests.get(url, headers=header)
        print(page.status_code)
        page.encoding = "utf-8"
        soup = BeautifulSoup(page.text, 'html.parser')
        xm = soup.find_all('tr')
        del xm[0]
        for item in xm:
            data = []
            item = str(item)
            zclx = re.findall(findZclx, item)[0]
            if zclx == "FZ":
                link = re.findall(findLink, item)[0]
                link = 'http://www.crpsz.com' + link
                title = re.findall(findTitle, item)[0]
                date = re.findall(findDate, item)[0]
                if re.search(Keyword, title):
                    data.append(link)
                    data.append(title)
                    data.append("服务")
                    data.append(date)
                    datalist.append(data)
                    number = number + 1
                    print("这是"+Keyword+'的第%d个数据'%number)
        time.sleep(3)
    return datalist


def SavePath(savepath, datalist):
    global number
    print("save.......")
    book = xlwt.Workbook(encoding="utf-8", style_compression=0)  # 创建workbook对象
    sheet = book.add_sheet('招标信息', cell_overwrite_ok=True)  # 创建工作表
    col = ("项目详情链接", "标题", "招采类型", "发布时间")
    for i in range(0, 4):
        sheet.write(0, i, col[i])  # 列名
    for i in range(0, number):
        # print("第%d条" % (i + 1))  # 输出语句,用来测试
        data = datalist[i]
        for j in range(0, 4):
            sheet.write(i + 1, j, data[j])  # 数据
    book.save(savepath)  # 保存


if __name__ == "__main__":
    main()
    print("爬取完毕")


有反爬措施,直接把你IP拉入黑名单了,你要么等一天自动解封,要么就使用IP代理池

像这种都是api接口的,可以超简单获取

import requests
import pandas as pd
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}

data = {
    'categorynum': '006001',
    'pageIndex': '1',
    'pageSize': '50000',
}

response = requests.post(
    'http://www.crpsz.com/EpointWebBuilder/rest/datalist/get',
    headers=headers,
    data=data,
    verify=False,
).json()
data=pd.DataFrame(response)

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7721738
  • 除此之外, 这篇博客: python之加载机器学习数据集(the way of delicious easy)中的 编者语:我们在用python进行数据分析,尤其是进行机器学习的学习时,会经常性的加载很多数据集,一般我们加载某些数据集,都是先从UCI数据集上找到某个数据集,然后下载,下载完成之后再用python加载。在我进行机器学习的初期,我用过这种方法几次,但这种方法真的是很麻烦,会浪费我们大量的时间。后来我发现,python有一些简单的库(或者称之为包)的东西,使之我们加载一些机器学习的数据集的时候方便、快捷(简单、粗暴)。好了,其他废话我就不在此赘余了,下面进入正题! 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    一、上面所说的加载数据集的方式也就是使用python的sklearn库,而且sklearn库的数据集也包含好多种:
                  ·自带的小数据集:sklearn.datasets.load_<name>

                  ·可在线下载的数据集:sklearn.datasets.fetch_<name>

                  ·计算机生成的数据集:sklearn.datasets.make_<name>

                  ·svmlight/libsvm格式的数据集:sklearn.datasets.load_svmlight_file(...)

                  ·从data.org在线下载获取的数据集:sklearn.datastes.fetch_mldata(...)

    二、除了sklearn导入之外,还可以找到所需数据集的网址,直接用python调用网址进行加载数据集,省去你中间下载数据集的繁琐操作

    关于sklearn库导入相关数据集,我只讲解:自带小数据集

    1、自带的小数据集:sklearn.datsets.load_<name>

    鸢尾花数据集load_iris()
    乳腺癌数据集load_breast_cancer()
    手写数字数据集load_digits()
    糖尿病数据集load_disbetes()
    波士顿房价数据集load_boston()
    体能训练数据集load_linnerud()
    #导入sklearn的库
    from sklearn.datasets import load_iris
    
    #加载鸢尾花数据集
    iris =load_iris()
    
    #输出数据集相关的操作属性,也就是“<数据集>.<操作属性>”
    print(iris.keys())
    
    #数据集类别的名称
    print('target_names',iris.target_names)
    
    #数据属性的名称
    print('feature_names',iris.feature_names)
    
    #数据集的描述,包括这个数据集所有的相关信息
    print('DESCR',iris.DESCR)

    实例1上手:

    #导入sklearn的库
    from sklearn.datasets import load_iris
    
    #加载鸢尾花数据集
    iris =load_iris()
    
    #将数据转为矩阵类型,也就是DataFrame
    import panda as pd
    
    #更改数据的列名
    df = pd.DataFrame(iris,columns=['属性1','属性2','属性3','类别'])
    
    #数据的条数和维数
    n_samples,n_features=iris.data.shape
    print("Number of sample:",n_samples)  
    print("Number of feature",n_features) 
    
    #x为数据集的属性集
    x = iris.data
    
    #y为数据集的类别集(标签)
    y = iris.target
    
    

    2、通过目标数据集网址加载数据集

    首先我们找到所需数据集的网址,我们以加载hayes-Roth数据集为例(关于如何从UCI数据集上找到目标数据集的网址我就不多说了,你需要UCI上的啥数据,你找到它复制下来就好了):

    hayes-Roth数据集的网址:

    https://archive.ics.uci.edu/ml/machine-learning-databases/hayes-roth/hayes-roth.data
    #此程序必须得在联网环境下运行
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    #导入hayes-roth数据集的网址
    dataset_url = "https://archive.ics.uci.edu/ml/machine-learning-databases/hayes-roth/hayes-roth.data"
    
    #设置数据集的列名称,也可以不进行设置
    names = ['hobby', 'age', 'educational level', 'marital status', 'class']
    
    #加载目标数据集
    dataset = pd.read_csv(dataset_url, names=names)
    
    #输出数据集的前20行
    print(dataset.head(20))
    
    #拆分原始数据集
    array = dataset.values
    
    #使x为数据集的前4列数据
    x = array[:,0:4]
    
    #使y为数据集的第5列数据
    y = array[:,4]
    #print(x)
    #print(y)
    
    #查看一共有几种类别以及每一种类的数量,以柱状图的形式展现出来
    sns.countplot(array[:,4])
        

    编者结束语:由于小编还在校学习,基本上上述两种方法就可以满足我几乎所有的日常需求,因此在这里我只详细解说的这两种方法。若以后接触到上述没有详细讲解的部分或其他方法,我会再进行补充,以供大家使用。

            当然,我还得感谢博主https://www.cnblogs.com/nolonely/p/6980160.html的文章,给我建立了一个非常不错的参考,若大家觉得我这篇博客还不错的话,就给我点个赞吧(加个关注就更好了)!

          欢迎各大神指教!

     

     


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^