精华内容
下载资源
问答
  • CSDN爬虫(二)——博客列表分页爬虫+数据库设计说明 开发环境:jdk1.7+myeclipse10.7+win74bit+mysql5.5+webmagic0.5.2+jsoup1.7.2 爬虫框架:webMagic 建议:建议首先阅读webMagic的文档,再查看此系列文章,便于...

    CSDN爬虫(二)——博客列表分页爬虫+数据库设计

    说明

    • 开发环境:jdk1.7+myeclipse10.7+win74bit+mysql5.5+webmagic0.5.2+jsoup1.7.2
    • 爬虫框架:webMagic
    • 建议:建议首先阅读webMagic的文档,再查看此系列文章,便于理解,快速学习:http://webmagic.io/
    • 开发所需jar下载(不包括数据库操作相关jar包):点我下载
    • 该系列文章会省略webMagic文档已经讲解过的相关知识。

    博客列表爬虫核心代码预览

        package com.wgyscsf.spider;
    
        import java.util.List;
    
        import us.codecraft.webmagic.Page;
        import us.codecraft.webmagic.Site;
        import us.codecraft.webmagic.Spider;
        import us.codecraft.webmagic.selector.Html;
        import us.codecraft.webmagic.selector.Selectable;
    
        import com.wgyscsf.utils.MyStringUtils;
    
        /**
         * @author wgyscsf</n> 编写日期 2016-9-24下午7:25:36</n> 邮箱 wgyscsf@163.com</n> 博客
         *         http://blog.csdn.net/wgyscsf</n> TODO</n>
         */
        public class CsdnBlogListSpider extends BaseSpider {
            private Site site = Site
                    .me()
                    .setDomain("blog.csdn.net")
                    .setSleepTime(300)
                    .setUserAgent(
                            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31");
    
            @Override
            public void process(Page page) {
                // 列表页: 这里进行匹配,匹配出列表页进行相关处理。在列表页我们获取必要信息。对于全文、评论、顶、踩在文章详情中。
                if ((page.getUrl()).regex(
                        "^http://blog.csdn.net/\\w+/article/list/[0-9]*[1-9][0-9]*$")
                        .match()) {
                    // 遍历出页码:遍历出div[@class=\"pagelist\"]节点下的所有超链接,该链接下是页码链接。将其加入到爬虫队列。【核心代码】
                    page.addTargetRequests(page
                            .getHtml()
                            .xpath("//div[@class=\"list_item_new\"]//div[@class=\"pagelist\"]")
                            .links().all());
                    // 作者
                    Selectable links = page.getHtml()
                            .xpath("//div[@class=\"header\"]//div[@id=\"blog_title\"]")
                            .links();
                    String blogUrl = links.get();
                    String id_author = MyStringUtils.getLastSlantContent(blogUrl);
                    id_author = id_author != null ? id_author : "获取作者id失败";
                    // System.out.println(TAG + author);
                    // 获取列表最外层节点的所有子节点。经过分析可以知道子节点有3个,“置顶文章”列表和“普通文章列表”和分页div。
                    List<String> out_div = page.getHtml()
                            .xpath("//div[@class=\"list_item_new\"]/div").all();
    
                    // 判断是否存在置顶文章:如何div的个数为3说明存在置顶文章,否则不存在置顶文章。
                    if (out_div.size() == 3) {
                        // 存在
                        processTopArticle(out_div.get(0), id_author);
                        processCommArticle(out_div.get(1), id_author);
                    } else if (out_div.size() == 2) {
                        // 不存在
                        processCommArticle(out_div.get(0), id_author);
                    } else {
                        System.err.println(TAG + ":逻辑出错");
                    }
    
                } else if (page.getUrl()
                        .regex("http://blog.csdn.net/\\w+/article/details/\\w+")
                        .match()) {
                    // 这里的逻辑还没处理,主要是为了获取全文、标签、顶、踩、评论等在列表页获取不到的数据
                }
            }
    
            /**
             * 处理普通文章列表
             */
            private void processCommArticle(String str, String id_author) {
                // 从列表页获取列表信息
                List<String> all;
                all = new Html(str).xpath("//div[@id=\"article_list\"]/div").all();
                if (!all.isEmpty())
                    for (String string : all) {
                        // 这里开始获取具体内容
    
                        // 单项第一部分:article_title
                        // 文章地址
                        String detailsUrl = new Html(string)
                                .xpath("//div[@class='article_title']//span[@class='link_title']//a/@href")
                                .toString();
                        // 文章id
                        String id_blog = MyStringUtils.getLastSlantContent(detailsUrl);
                        // 文章标头
                        String title = new Html(string)
                                .xpath("//div[@class='article_title']//span[@class='link_title']//a/text()")
                                .toString();
                        // 文章类型
                        String type = getArticleType(string);
                        // 单项第二部分:article_description
                        String summary = new Html(string).xpath(
                                "//div[@class='article_description']//text()")
                                .toString();
                        // 单项第三部分:article_manage
                        String publishDateTime = new Html(string)
                                .xpath("//div[@class='article_manage']//span[@class='link_postdate']//text()")
                                .toString();
                        // 阅读量
                        String viewNums = new Html(string)
                                .xpath("//div[@class='article_manage']//span[@class='link_view']//text()")
                                .toString();
                        viewNums = MyStringUtils.getStringPureNumber(viewNums);
                        // 评论数
                        String commentNums = new Html(string)
                                .xpath("//div[@class='article_manage']//span[@class='link_comments']//text()")
                                .toString();
                        commentNums = MyStringUtils.getStringPureNumber(commentNums);
                        // 开始组织数据
                        System.out.println(TAG + ":,文章id:" + id_blog + ",文章标头:" + title
                                + ",文章类型('0':原创;'1':转载;'2':翻译):" + type + ",发表日期:"
                                + publishDateTime + ",阅读量:" + viewNums + ",评论数:"
                                + commentNums + ",文章地址:" + detailsUrl + ",文章摘要:"
                                + summary + "");
    
                    }
    
            }
    
            /**
             * 处理置顶文章列表
             */
            private void processTopArticle(String topListDiv, String id_author) {
                // 从列表页获取列表信息
                List<String> all;
                all = new Html(topListDiv).xpath("//div[@id=\"article_toplist\"]/div")
                        .all();
                if (!all.isEmpty())
                    for (String string : all) {
                        // 单项第一部分:article_title
                        // 文章地址
                        String detailsUrl = new Html(string)
                                .xpath("//div[@class='article_title']//span[@class='link_title']//a/@href")
                                .toString();
                        // 文章id
                        String id_blog = MyStringUtils.getLastSlantContent(detailsUrl);
                        // 文章标头
                        String title = new Html(string)
                                .xpath("//div[@class='article_title']//span[@class='link_title']//a/text()")
                                .toString();
                        // 文章类型
                        String type = getArticleType(string);
                        // 单项第二部分:article_description
                        String summary = new Html(string).xpath(
                                "//div[@class='article_description']//text()")
                                .toString();
                        // 单项第三部分:article_manage
                        String publishDateTime = new Html(string)
                                .xpath("//div[@class='article_manage']//span[@class='link_postdate']//text()")
                                .toString();
                        // 阅读量
                        String viewNums = new Html(string)
                                .xpath("//div[@class='article_manage']//span[@class='link_view']//text()")
                                .toString();
                        viewNums = MyStringUtils.getStringPureNumber(viewNums);
                        // 评论数
                        String commentNums = new Html(string)
                                .xpath("//div[@class='article_manage']//span[@class='link_comments']//text()")
                                .toString();
                        commentNums = MyStringUtils.getStringPureNumber(commentNums);
    
                        // 开始组织数据
                        System.out.println(TAG + ":,文章id:" + id_blog + ",文章标头:" + title
                                + ",文章类型('0':原创;'1':转载;'2':翻译):" + type + ",发表日期:"
                                + publishDateTime + ",阅读量:" + viewNums + ",评论数:"
                                + commentNums + ",文章地址:" + detailsUrl + ",文章摘要:"
                                + summary + "");
    
                    }
            }
    
            /**
             * 获取文章类型
             */
            private String getArticleType(String string) {
                String type;
                type = new Html(string)
                        .xpath("//div[@class='article_title']//span[@class='ico ico_type_Original']//text()")
                        .get();// 原创类型
                if (type != null)
                    return 0 + "";
                type = new Html(string)
                        .xpath("//div[@class='article_title']//span[@class='ico ico_type_Repost']//text()")
                        .get();// 原创类型
                if (type != null)
                    return 1 + "";
                type = new Html(string)
                        .xpath("//div[@class='article_title']//span[@class='ico ico_type_Translated']//text()")
                        .get();// 原创类型
                if (type != null)
                    return 2 + "";
                return 3 + "";
            }
    
            @Override
            public Site getSite() {
                return site;
            }
    
            public static void main(String[] args) {
                Spider.create(new CsdnBlogListSpider())
                        .addPipeline(null)
                        .addUrl("http://blog.csdn.net/" + "wgyscsf" + "/"
                                + "article/list/1").run();
            }
    
        }
    

    关键代码解释

    • page.getUrl()).regex("^http://blog.csdn.net/\\w+/article/list/[0-9]*[1-9][0-9]*$").match() ,每次正则表达式都是一个难点。这句话的意思是:http://blog.csdn.net/用户id/article/list/页码,这个网址包含两个可变字符串:用户id和页码,这个正则主要是为了匹配这个规则。如果是爬取单个用户就不用这个麻烦。但是,后期如果我们有很多用户id,这样写才能更加方便的去爬取任意用户。
    • page.addTargetRequests(page.getHtml().xpath("//div[@class=\"list_item_new\"]//div[@class=\"pagelist\"]").links().all())这句话是整个博客列表爬取的核心。它负责找到个页面下所有有效的列表链接,加入到爬虫队列,到爬虫队列,还会走上面所提到的正则进行匹配,加入到列表页的解析,是一个迭代的过程。当然,如果想要更加严谨,也可以做一个正则的匹配,比如我只抓取div[@class=\"pagelist\"]下符合页表页规则的链接。当然,这里是进行了分析,里面只包含有效链接,就没有再进行判断。页码所在的div如下:

      <!--显示分页-->
      <div id="papelist" class="pagelist">
          <span> 49条  共4页</span>
          <a href="/wgyscsf/article/list/1">首页</a> 
          <a href="/wgyscsf/article/list/1">上一页</a> 
          <a href="/wgyscsf/article/list/1">1</a> 
          <strong>2</strong> 
          <a href="/wgyscsf/article/list/3">3</a> 
          <a href="/wgyscsf/article/list/4">4</a> 
          <a href="/wgyscsf/article/list/3">下一页</a> 
          <a href="/wgyscsf/article/list/4">尾页</a> 
      </div>
      
    • page.getHtml().xpath("//div[@class=\"list_item_new\"]/div").all();这里需要注意的是,需要判断返回List的个数,进而判断是否存在“置顶文章”。如果存在先处理“置顶文章”逻辑,再处理普通文章逻辑。经过分析可以知道子节点有3个,“置顶文章”列表div和“普通文章”列表div和分页div。

    • getArticleType(String string)特别注意这个方法里面关于文章类型的处理,如何判断是何种类型的文章,可以尝试获取对应文章所处的div,如果返回不为null,即说明存在,否则不存在。大致如下:

      String type;
      type = new Html(string).xpath("//div[@class='article_title']//span[@class='ico ico_type_Original']//text()").get();// 原创类型
      if (type != null)
          return 0 + "";// 说明是原创
      

    数据库设计

    设计原则

    • 全部字段允许为空,包括相关所属唯一id。另外新建一个id,随机生成UUID,作为主键。原因:因为爬虫可能会出现爬不到的数据,或者“脏数据”,所以尽可能使数据库不那么“严谨”,保证程序能够正常走下去。在表中新建一个id作为主键,这个可以保证在获取相应表id失败的情况下,仍然可以正常运行。
    • 每个表的所属id(不是新建的),比如作者id、文章id、个人id等可以标示一行数据的字段,全部加上【索引】。原因:后期需要保存大量用户以及文章数据,保存之前我们需要拿获取到表的id去查询数据库中是否存在,需要有一个查询的过程。查询是一个遍历的过程,加与不加【索引】对程序影响巨大。简单测试如下(不带索引与带索引的查询时间,数据量:80W):
      这里写图片描述
      这里写图片描述
    • 尽可能加上所有直接相关的所有字段,不管现有爬虫技术是否能实现。并且,再加上必要的备用字段。原因:数据表修改麻烦,尽可能后期不要修改。不能直接过去的数据,可能会在其它模块获取,比如“博客详情”与“博客列表”之间的关系。
    • 不使用外键,原因:同第一条。
    • 主键不用自增的,而是采用手动生成。

    表结构

    这里写图片描述

    建表语句

    • 在操作代码中附带

    操作代码

    点我下载

    个人公众号,及时更新技术文章(请移步公众号,文章会被官方删除)

    展开全文
  • 分享一则对于网抓中面对post请求访问的页面或者在分页过程中需要post请求才可以访问的内容! 面的post请求的网址是不可以零参访问网址的,所以我们在网抓的过程中需要给请求传表单数据,下面看一下网页中post请求...

    分享一则对于网抓中面对post请求访问的页面或者在分页过程中需要post请求才可以访问的内容!

     

    面的post请求的网址是不可以零参访问网址的,所以我们在网抓的过程中需要给请求传表单数据,下面看一下网页中post请求的网址:

     post请求状态码和get请求的状态码一致,但是在参数中我们可以看到表单数据有很多的参数:

     

     

     

     

     

     

     

     

     

    其中的__VIEWSTATE是必须要传的参数,而这个参数是在源码中能获取到的,这个__VIEWSTATE是asp.net中特有的,所以只有在访问asp.net的网站的时候这个参数是必须传的,其他的网站,只要有参数变化的表单数据就需要传到post请求中!

    我们在转页的过程中会看到类似于这样的表单,那后面的数字就是我们转页后的页码!所以我们的这个参数也要传,获取转页的页码的总数,同样可以在源码中获取,如果只显示了1234页,那就需要计算你需要的内容有多少个,每一页的内容个数,做一个取余算法就可以算出来了!

    现在定义一个post_data:

    1 post_data={"__EVENTTARGET":"Pager1","__EVENTARGUMENT":page_num,"ddlManufacturer":"0","Pager1_input":str(page_num-1)}

    这是我自定义的post参数,page_num代表着分页的页码。

    __VIEWSTATE是在源码中,这里分享的是xpath方法:

    1 a = doc.xpath('//input[@id="__VIEWSTATE"]')
    2 if len(a) > 0:
    3     post_data['__VIEWSTATE'] = a[0].get('value')

    使用BeautifulSoup就是:

    1 soup = BeautifulSoup(h,"html.parser")
    2 a = soup.find('input',id='__VIEWSTATE')
    3 if a:
    4     post_data['__VIEWSTATE'] = a['value']

    获取到重要的表单数据后,我们就只需要传参访问网页源码了!

    1 r2 = requests.post(url,data=post_data,headers=headers,timeout=20)
    2 ht2 = r2.content  #这里就是访问的网页源码!

    xpath的解析代码:  doc2 = HTML.document_fromstring(网页源码) 

    网页的简单post请求就是这样来传递参数,访问的!我自己还有很多的学习资料分享在607021567qq群里面了!还有微信飞机大战的源代码分享!

     

    转载于:https://www.cnblogs.com/zhuPython/p/7886171.html

    展开全文
  • KFC-位置分页爬虫

    2019-10-04 18:40:32
    import requests import json if name == 'main': #记录总数 raw_count=0 #查询页数 page=1 #存储数据 data=[] #判断有无数据条件 ...#python中没有null,防止转dict异常 ...place=input("请输入想要查询的区域:") ...

    import requests
    import json

    if name == 'main':
    #记录总数
    raw_count=0
    #查询页数
    page=1
    #存储数据
    data=[]
    #判断有无数据条件
    size=10
    #python中没有null,防止转dict异常
    global null
    null = ''
    place=input("请输入想要查询的区域:")
    while True:
    url="http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword"
    params={
    'cname':'',
    'pid':'',
    'keyword':place,
    'pageIndex':page,
    'pageSize':10
    }
    headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
    }
    res=requests.post(url=url,params=params,headers=headers)
    print(eval(res.text))
    movie_dict=eval(res.text)
    raw_count=movie_dict['Table'][0]['rowcount']
    if raw_count>size:
    data.extend(movie_dict['Table1'])
    else:
    data.extend(movie_dict['Table1'])
    with open(f"./{place}.json","w",encoding="utf8")as fw:
    json.dump(data,fw,ensure_ascii=False)
    break
    size+=10
    page+=1

    转载于:https://www.cnblogs.com/zx125/p/11389830.html

    展开全文
  • 简单的scrapy分页爬虫

    2019-04-05 20:10:08
    首先我们需要安装几个依赖包先 wheel lxml pyopenssl Twisted pywin32 scrapy 最好就是按顺序安装吧 看看能不能直接pip install … 不行的话这里有依赖包的下载链接 ...可以直接下载到本地来, 然后再pip inst...

    首先我们需要安装几个依赖包先

    • wheel
    • lxml
    • pyopenssl
    • Twisted
    • pywin32
    • scrapy

    最好就是按顺序安装吧

    看看能不能直接pip install …

    不行的话这里有依赖包的下载链接

    可以直接下载到本地来, 然后再pip install …

    还可以去pycharm那里安装

    好了, 在这里安装好多有依赖包之后我们的scrapy环境就搭好了

    下面开始创建第一个项目

    在这里插入图片描述
    这样就说明你创建成功了,它在D盘, 叫demo

    下面的这个项目是

    • scrapy startproject a51job
    • scrapy genspider 51job 51job.com

    main.py

    from scrapy.cmdline import execute
    
    execute('scrapy crawl 51job'.split())
    

    a51job.py

    # -*- coding: utf-8 -*-
    import scrapy
    from job.items import JobItem
    """
    为了创建一个Spider,您必须继承 scrapy.Spider 类, 且定义以下三个属性:
        1 name: 用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。
        2 start_urls: 包含了Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将
          是其中之一。 后续的URL则从初始的URL获取到的数据中提取。
        3 parse() 是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象
          将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取
          数据(生成item)以及生成需要进一步处理的URL的 Request 对象
    """
    class A51jobSpider(scrapy.Spider):
        name = '51job'
        allowed_domains = ['51job.com']
        # def start_requests(self) 可以重写这个方法
        start_urls = ['https://search.51job.com/']
    
        def parse(self, response):
            # extract(): 序列化该节点为unicode字符串并返回list
            info = response.xpath("//div[@class='el']")
            print(info)
            # 通过yield传文本item到pipeline, 如果是url就到schedule再爬
            # 第一种写法
            # for i in info:
            #     item = JobItem()
            #     item['job']=i.xpath("./p/span/a/@title").extract()
            #     item['area']=i.xpath("./span[@class='t3']/text()").extract()
            #     yield item
            # 另一种写法
            for i in info:
                yield{
                    'job' : i.xpath("./p/span/a/@title").extract_first(),
                    'area' : i.xpath("./span[@class='t3']/text()").extract_first()
                }
            #爬取多页要点, 从下一页入手,分析每一页链接的规律,构造出新的链接
            next_page = response.xpath("//li[@class='bk']/a/@href").extract_first()
            print('aaa')
            print(next_page)
            for i in range(2,5):
                print(i)
                next_page = 'https://search.51job.com/list/030600,000000,0000,00,9,99,%2B,2,'+str(i)+'.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=3'
                next_page = response.urljoin(next_page)
                print('bbb',next_page)
                yield scrapy.Request(next_page, callback=self.parse)
    

    item.py

    # -*- coding: utf-8 -*-
    """
    爬取的主要目标就是从非结构性的数据源提取结构性数据,例如网页。
    Scrapy提供 Item 类来满足这样的需求。
    Item 对象是种简单的容器,保存了爬取到得数据。
    其提供了 类似于词典(dictionary-like) 的API以及用于声明可用字段的简单语法。
    """
    
    import scrapy
    
    class JobItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        job = scrapy.Field()
        area = scrapy.Field()
    
    

    pipeline.py

    # -*- coding: utf-8 -*-
    """
    item pipeline的主要作用:
        清理html数据
        验证爬取的数据
        去重并丢弃
        讲爬取的结果保存到数据库中或文件中
    
    process_item(self,item,spider)
    每个item piple组件是一个独立的pyhton类,必须实现以process_item(self,item,spider)方法
    每个item pipeline组件都需要调用该方法,这个方法必须返回一个具有数据的dict,或者item对象,
    或者抛出DropItem异常,被丢弃的item将不会被之后的pipeline组件所处理
    
    下面的方法也可以选择实现
    open_spider(self,spider)
    表示当spider被开启的时候调用这个方法
    
    close_spider(self,spider)
    当spider挂去年比时候这个方法被调用
    
    from_crawler(cls,crawler)
    这个和我们在前面说spider的时候的用法是一样的,可以用于获取settings配置文件中的信息,需要注意的这个是一个类方法
    """
    import json
    
    class JobPipeline(object):
        def __init__(self):
            self.filename = open("test1.txt", "w", encoding="utf-8")
    
        def process_item(self, item, spider):
            print(item)
            # self.filename.write(str(item)+"\n")
            self.filename.write(json.dumps(item,ensure_ascii=False)+'\n')
            self.filename.flush()
            return item
    
        def close_spider(self, spider):
            self.filename.close()
    
    

    setting.py

    # -*- coding: utf-8 -*-
    
    # Scrapy settings for job project
    #
    # For simplicity, this file contains only settings considered important or
    # commonly used. You can find more settings consulting the documentation:
    #
    #     https://doc.scrapy.org/en/latest/topics/settings.html
    #     https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
    #     https://doc.scrapy.org/en/latest/topics/spider-middleware.html
    
    BOT_NAME = 'job'
    
    SPIDER_MODULES = ['job.spiders']
    NEWSPIDER_MODULE = 'job.spiders'
    
    
    # Crawl responsibly by identifying yourself (and your website) on the user-agent
    USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    
    # Obey robots.txt rules
    # 当爬取内容不符合该协议且仍要爬取时
    # 设置 ROBOTSTXT_OBEY = False ,不遵守此协议
    ROBOTSTXT_OBEY = False
    
    # Configure maximum concurrent requests performed by Scrapy (default: 16)
    #CONCURRENT_REQUESTS = 32ELAY = 3
    
    # Configure a delay for requests for the same website (default: 0)
    # See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay
    # See also autothrottle settings and docs
    # DOWNLOAD_D
    # The download delay setting will honor only one of:
    #CONCURRENT_REQUESTS_PER_DOMAIN = 16
    #CONCURRENT_REQUESTS_PER_IP = 16
    
    # Disable cookies (enabled by default)
    #COOKIES_ENABLED = False
    
    # Disable Telnet Console (enabled by default)
    #TELNETCONSOLE_ENABLED = False
    
    # Override the default request headers:
    #DEFAULT_REQUEST_HEADERS = {
    #   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    #   'Accept-Language': 'en',
    #}
    
    # Enable or disable spider middlewares
    # See https://doc.scrapy.org/en/latest/topics/spider-middleware.html
    #SPIDER_MIDDLEWARES = {
    #    'job.middlewares.JobSpiderMiddleware': 543,
    #}
    
    # Enable or disable downloader middlewares
    # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
    #DOWNLOADER_MIDDLEWARES = {
    #    'job.middlewares.JobDownloaderMiddleware': 543,
    #}
    
    # Enable or disable extensions
    # See https://doc.scrapy.org/en/latest/topics/extensions.html
    #EXTENSIONS = {
    #    'scrapy.extensions.telnet.TelnetConsole': None,
    #}
    
    # Configure item pipelines
    # See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    # 每个pipeline后面有一个数值,这个数组的范围是0-1000,这个数值确定了他们的运行顺序,数字越小越优先
    ITEM_PIPELINES = {
       'job.pipelines.JobPipeline': 300,
    }
    
    # Enable and configure the AutoThrottle extension (disabled by default)
    # See https://doc.scrapy.org/en/latest/topics/autothrottle.html
    #AUTOTHROTTLE_ENABLED = True
    # The initial download delay
    #AUTOTHROTTLE_START_DELAY = 5
    # The maximum download delay to be set in case of high latencies
    #AUTOTHROTTLE_MAX_DELAY = 60
    # The average number of requests Scrapy should be sending in parallel to
    # each remote server
    #AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
    # Enable showing throttling stats for every response received:
    #AUTOTHROTTLE_DEBUG = False
    
    # Enable and configure HTTP caching (disabled by default)
    # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
    #HTTPCACHE_ENABLED = True
    #HTTPCACHE_EXPIRATION_SECS = 0
    #HTTPCACHE_DIR = 'httpcache'
    #HTTPCACHE_IGNORE_HTTP_CODES = []
    #HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
    
    
    展开全文
  • 文章同步:http://blog.csdn.net/wgyscsf
  • 分页爬虫线程模型

    2015-08-08 12:46:00
    每个网站一个处理线程,爬取列表和爬取明细采用单独的子线程,列表爬取线程相当于生成者,分页一般在几十条,有些网站可在请求中指定分页大小参数可达百条一页,生产速度足够消费,单线程爬取解析列表,往无界阻塞...
  • Node 用来写爬虫还是挺方便的,网上大部分文章都是单进程爬取,抽下班时间写了个多进程爬虫,源码在文末~ 每篇文章都希望你能收获到东西,这篇是基于 Node.js 的多进程爬虫,希望你看完有这些收获: Node c...
  • 分页网络爬虫

    2018-06-05 15:01:44
    简单的单线程分页爬虫,适合天涯、黄页等网站。需要自己改一下正则匹配。纯原创
  • Python应用场景Scrapy 爬虫框架课程特色时间就是生命,浓缩才是精华 (4小时,完成了Scrapy爬虫必备知识点讲解)课程体系完整 ( 应用场景、Scrapy体系结构、分页爬虫、整站爬虫、爬虫伪装)案例驱动教学 (深入浅出、...
  • # 百度贴吧分页爬取练习 import urllib.request # 请求库 import urllib.parse # 解析 import random # 随即库 # 封装三个请求头,由于防爬 headers = [{"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) Apple...
  • 系列教程《手把手教你写电商爬虫》第二课,详细讲解了如何开发爬虫爬取一些有名的电商网站数据。对于学习爬虫的开发者有很大帮助,内含大量可直接运行的源码。...第二课主要以爬取尚妆网分页商品信息为例。
  • 爬虫案例二:分页

    2019-09-30 22:36:06
    爬取题目网站:http://glidedsky.com/ 相关文章 我的个人博客网站是:www.coderyyn.cn 上面会不定期分享有关爬虫、算法、环境搭建以及有趣的帖子 欢迎大家一起交流学习 转载请注明 ...
  • 爬虫爬取网页图片(分页)不分页 源码:import requestsimport reurl = 'https://www.qiushibaike.com/imgrank/'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, ...
  • python爬虫 分页获取图片并下载

    千次阅读 2015-08-14 14:17:49
    python网页爬虫,抓取所需要的图片,并下载下来,可以分页抓取## 刚接触python2天,想快速上手,就写了个爬虫,写完之后,成就感暴增,用起来顺手多了
  • 爬虫抓取分页数据的简单实现

    千次阅读 2019-09-28 23:21:02
    爬虫抓取分页数据的简单实现 昨天,我们已经利用Jsoup技术实现了一个简单的爬虫,原理很简单,主要是要先分析页面,拿到条件,然后就去匹配url,采用dome解析的方式循环抓取我们需要的数据,从而即可轻松...
  • 对了 昨天爬了boss今天打开那个网页需要验证一下才能正常使用,爬虫频繁访问人家的网站确实会对人家的服务器造成很大的压力。 直接上源码: #coding=utf-8 import re,requests,json import time from lxml import ...
  • 这是我第一次提问~~我正在制作一个网络爬虫,我想用它来爬取invia.cz上所有的酒店链接和名称。 <pre><code>import scrapy y=0 class invia(scrapy.Spider): name = 'Kreta' start_urls = ['...
  • 这个电商网站好好的练了一次手,相信大家都应该对写爬虫的流程有了一个大概的了解,那么这课咱们就话不多说,正式上战场,对垒尚妆网。   首先,向我们被爬网站致敬,没有他们提供数据,我们更是无从爬起,所以先...
  • 爬虫之Scrapy和分页

    2019-10-04 07:19:19
    下载器发送请求,获取响应---->下载中间件---->引擎--->爬虫中间件--->爬虫 爬虫提取url地址,组装成request对象---->爬虫中间件--->引擎--->调度器 爬虫提取数据--->引擎--->管道 管道进行数据的处理和保存 ...
  • Python3爬虫 处理分页

    千次阅读 2017-07-26 17:13:07
    import logging import random import threading import urllib.parse import urllib.parse import urllib.request from queue import Queue import pymysql from bs4 import BeautifulSoup import time ...
  • Python 爬虫抓取图片(分页)

    千次阅读 2017-09-04 00:36:21
    import urllib import re error_count = 0 down_path = r'C:\liujwFiles\NON_IBM_Files\PycharmProjects\pa_chong_files' for page in range(1, 11): # page 1--10 #The pages after the first page(2--10)
  • 爬虫实现的功能: 随便在豆瓣网站中选择一部电影,获取影片详细信息,并自动获取该影片的短评链接,再跳转到短评页面,获取各位观众的影评,最后将爬取的数据存储到数据库中。 开发环境: python3 + pycharm +WIN ...
  • ![图片说明](https://img-ask.csdn.net/upload/201901/24/1548312413_156413.png) 我想爬取一个分页数据,为什么这段代码的结果是这个?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,229
精华内容 3,691
关键字:

分页怎么爬虫

爬虫 订阅