多线程爬取百度百科

  • 前言:
    EVERNOTE里的一篇笔记,我用了三个博客才学完...真的很菜...百度百科和故事网并没有太过不一样,修改下编码,debug下,就可以爬下来了,不过应该是我爬的东西太初级了,而且我爬到3000多条链接时,好像被拒绝了...爬取速度也很慢,估计之后要接触一些优化或者多进程,毕竟python是假的多线程。
    本博客参照代码及PROJECT来源:http://kexue.fm/archives/4385/

  • 源代码:

     1 #! -*- coding:utf-8 -*-
     2 import requests as rq
     3 import re
     4 import time
     5 import datetime
     6 from multiprocessing.dummy import Pool,Queue
     7 import pymysql
     8 from urllib import parse
     9 import html
    10 import importlib
    11 from urllib.request import urlopen
    12 from bs4 import BeautifulSoup
    13 unescape = html.unescape #用来实现对HTML字符的转移
    14
    15 tasks = Queue()
    16 tasks_pass = set() #已队列过的链接
    17 tasks.put(‘http://baike.baidu.com/item/科学‘)
    18 count = 0 #已爬取页面总数
    19
    20 url_split_re = re.compile(‘&|\+‘)
    21 def clean_url(url):
    22     url = parse.urlparse(url)
    23     return url_split_re.split(parse.urlunparse((url.scheme, url.netloc, url.path, ‘‘, ‘‘, ‘‘)))[0]
    24
    25 def main():
    26     global count,tasks_pass
    27     while True:
    28         url = tasks.get() #取出一个url,并且在队列中删除掉
    29         web = rq.get(url).content.decode(‘utf8‘,‘ignore‘)
    30         urls = re.findall(u‘href="(/item/.*?)"‘, web) #查找所有站内链接
    31         for u in urls:
    32             try:
    33                 u = rq.get(u).content.decode(‘utf8‘)
    34             except:
    35                 pass
    36             u = ‘http://baike.baidu.com‘ + u
    37             u = clean_url(u)
    38             if (u not in tasks_pass): #把还没有队列过的链接加入队列
    39                 tasks.put(u)
    40                 tasks_pass.add(u)
    41             web1 = rq.get(u).content.decode(‘utf8‘, ‘ignore‘)
    42             bsObj = BeautifulSoup(web1, "lxml")
    43             text = bsObj.title.get_text()
    44             print(datetime.datetime.now(), ‘   ‘, u, ‘   ‘, text)
    45             db = pymysql.connect("localhost", "testuser", "test123", "TESTDB", charset=‘utf8‘)
    46             dbc = db.cursor()
    47             sql = "insert ignore into baidubaike(url,title) values(%s,%s);"
    48             data = (u, text)
    49             dbc.execute(sql, data)
    50             dbc.close()
    51             db.commit()
    52         count += 1
    53         if count % 100 == 0:
    54             print(u‘%s done.‘ % count)
    55
    56 pool = Pool(4, main) #多线程爬取,4是线程数
    57 total = 0
    58 while True: #这部分代码的意思是如果20秒内没有动静,那就结束脚本
    59     time.sleep(60)
    60     if len(tasks_pass) > total:
    61         total = len(tasks_pass)
    62     else:
    63         break
    64
    65 pool.terminate()
    66 print("terminated normally")

  • BUG:

    raise RemoteDisconnected("Remote end closed connection without" http.client.RemoteDisconnected: Remote end closed connection without response

    问题在于没有伪装请求头

    来源:http://blog.csdn.net/u013424864/article/details/60778031

时间: 2024-10-22 11:33:29

多线程爬取百度百科的相关文章

Python开发简单爬虫(二)---爬取百度百科页面数据

一.开发爬虫的步骤 1.确定目标抓取策略: 打开目标页面,通过右键审查元素确定网页的url格式.数据格式.和网页编码形式. ①先看url的格式, F12观察一下链接的形式;② 再看目标文本信息的标签格式, 比如文本数据为div class="xxx", ③ 容易看到编码为utf-8 2.分析目标 目标: 百度百科python词条 入口页: http://baike.baidu.com/item/Python词条页面url格式:/item/**** 数据格式: 标题: <dd cl

python3 爬虫学习-根据关键词爬取百度百科内容

小白编了好久才写出来,记录一下免得之后再用的时候都忘了还得重新学~ 学习爬虫最开始是学习了慕课上的python课程,然后学习了慕课和网易云上的爬虫教程.这两个自己去查一下就好了~ 开始还比较费劲,毕竟熟悉需要时间么,而且python也不太熟悉. 关于python版本:我一开始看很多资料说python2比较好,因为很多库还不支持3,但是使用到现在为止觉得还是pythin3比较好用,因为编码什么的问题,觉得2还是没有3方便.而且在网上找到的2中的一些资料稍微改一下也还是可以用. 好了,开始说爬百度百

python爬虫—爬取百度百科数据

爬虫框架:开发平台 centos6.7 根据慕课网爬虫教程编写代码 片区百度百科url,标题,内容 分为4个模块:html_downloader.py 下载器 html_outputer.py 爬取数据生成html模块 html_parser 获取有用数据 url_manager url管理器 spider_main 爬虫启动代码 spider_main.py 1 #!/usr/bin/python 2 #-*- coding: utf8 -*- 3 4 import html_download

Python3爬取百度百科(配合PHP)

用PHP写了一个网页,可以获取百度百科词条:http://www.selflink.cn/xiaobaike(只爬取摘要部分) 那么通过Python来爬取,只需要不断向这个网页POST数据,获取返回值就可以了.由于是我自己的网页,保存返回值我也让PHP在服务器端来完成了,所以Python的任务只需要不断向服务器POST数据. 那么POST什么数据呢?暂时找到了一个名词大全的网页.http://cidian.911cha.com/cixing_mingci.html 足足20页的名词,足够作为名词

最最简单的python爬虫教程--爬取百度百科案例

from bs4 import BeautifulSoupfrom urllib.request import urlopenimport reimport randombase_url = "https://baike.baidu.com"#导入相关的包 his = ["/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/5162711"]#初始化url#循环选取20百度百科的数据for i in range(20):url =

多线程爬取糗事百科热门段子 (改写前天的博客)

利用多线程爬取,除了先前用到的几个模块之外,还需用到threading模块和queue模块: 为每一件事情开启一个线程:构造url_list.发送请求.提取数据.保存数据 __init__方法添加三个实例属性队列分别存放:url.响应内容.处理后的数据 改写原先每一个方法里的代码,需要的东西直接从队列中取出,此时方法都无需多余参数了 每当从一个队列取出数据,记得执行task_done()方法,使计数减一 run()方法里把yaozhixing的事情都开启一个线程,比较慢的事情,比如网络请求,可以

Python爬虫实战二之爬取百度贴吧帖子

大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不好使,八成是正则表达式那儿匹配不到了,请更改一下正则,当然最主要的还是帮助大家理解思路. 2016/12/2 本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件 1.URL格式的确定 首先,我们先观察一下百度贴吧的任意一个帖子. 比如:ht

requests+xpath+map爬取百度贴吧

1 # requests+xpath+map爬取百度贴吧 2 # 目标内容:跟帖用户名,跟帖内容,跟帖时间 3 # 分解: 4 # requests获取网页 5 # xpath提取内容 6 # map实现多线程爬虫 7 import requests 8 from requests.exceptions import RequestException 9 from lxml import etree 10 import json 11 from multiprocessing.dummy imp

python学习笔记之爬虫之爬取百度贴吧某一帖子

从大神这儿静觅 ? Python爬虫实战二之爬取百度贴吧帖子讲的很不错,按照步骤一步一步的做效果很明显.第一次真正做出一个小爬虫程序,所以在csdn写出来也是对自己的一种鞭策一种鼓励,不喜勿喷,还请大神不吝赐教. 因为大神博文讲的很详细(真心详细),所以步骤我就不一一细说了 先把自己的代码贴出来(大部分一样): #!/usr/bin/env python # coding=utf-8 import urllib2 import urllib import re class Tool(object