1、安装需要的库

bs4 beautifulSoup  requests lxml
如果使用mongodb存取数据,安装一下pymongo插件

2、常见问题

1> lxml安装问题

如果遇到lxml无法安装问题,参考知乎上的答案:

首先,安装wheel,命令行运行:pip install wheel
其次,在这里下载对应的.whl文件,注意别改文件名!http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml
Ctrl + F,输入lxml,找到下面这段Lxml,
Lxml, a binding for the libxml2 and libxslt libraries.
lxml‑3.7.1‑cp27‑cp27m‑win32.whl

lxml‑3.7.1‑cp27‑cp27m‑win_amd64.whl

lxml‑3.7.1‑cp34‑cp34m‑win32.whl

lxml‑3.7.1‑cp34‑cp34m‑win_amd64.whl

lxml‑3.7.1‑cp35‑cp35m‑win32.whl

lxml‑3.7.1‑cp35‑cp35m‑win_amd64.whl

lxml‑3.7.1‑cp36‑cp36m‑win32.whl

lxml‑3.7.1‑cp36‑cp36m‑win_amd64.whl
cp后面是Python的版本号,27表示2.7,根据你的Python版本选择下载。
之后, 进入.whl所在的文件夹,执行命令即可完成安装pip install 带后缀的完整文件名

2> pip问题
如果提示 'pip' 不是内部或外部命令,也不是可运行的程序。

多是因为环境变量没有设置好。需要设置两个,一些常用的命令在Scripts文件夹下面

以下两个改为自己计算机的路径

C:\Files\Python\Python36
C:\Files\Python\Python36\Scripts

3、mongodb

如何安装mongodb参见https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

服务启动与停止

sudo service mongod start
sudo service mongod stop
sudo service mongod restart

配置文件位于 /etc/mongod.conf,默认端口 27017 ,修改可以在配置文件中修改

# network interfaces
net:
port:
# bindIp: 127.0.0.1

此外,默认绑定了ip地址127.0.0.1,需要将此句注释掉,否则远程无法访问

4、参考代码

import requests
from bs4 import BeautifulSoup
import time
import pymongo
import random
from multiprocessing import Pool
# 导入多个对象或者函数用逗号分开
# from test_parsing import get_items,url_list # mongodb客户端
client = pymongo.MongoClient('192.168.1.101',27017)
# 数据库
test = client['testdata']
# 各种表
tb = test['testtable']
mb= test['itemtable']
detail= test['detailtable'] headers = {
User-Agent:
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
'Connection':'keep-alive'
} proxy_list = [
'http://118.79.27.123:8081',
'http://113.108.253.195:9797',
] # 随机获取代理ip
proxy_ip = random.choice(proxy_list)
proxies = {'http': proxy_ip} # 简单用例
def get_pages_within(pagenums):
for page_num in range(1,pagenums+1):
# 请求
wb_data = requests.get('http://urldata/test/pn{}/'.format(page_num))
# 包装一个对象
soup = BeautifulSoup(wb_data.text,'lxml')
# 使用select方法,参数为样式选择器,div.price_li > span 标识逐层级关系,div.price_li span 只是简单的包含关系
numbers = soup.select('div.number')
prices = soup.select('span.price') links = soup.select('a.t') for number, price, link in zip(numbers,prices,links):
if int(price.get_text()) > 500:
print(number,price)
data = {
'title':number.get_text(),
'price':price.get_text(),
'link' :link.get('href')
}
tb.insert_one(data)
print('finished') # 复杂点的
def get_links_from(source, pages, flag='c'):
list_view = '{}{}{}/'.format(source, str(flag), str(pages))
# 带参数
wb_data = requests.get(list_view,headers=headers,proxies=proxies)
soup = BeautifulSoup(wb_data.text, 'lxml')
if soup.find('ul', 'pageLink'):
for link in soup.select('.fenlei dt a'):
item_link = link.get('href')
mb.insert_one({'url': item_link})
print(item_link) else:
pass def get_detail_from(url,data=None):
wb_data = requests.get(url,headers=headers)
time.sleep(1)
# flag = 'flagnumber' in soup.find('script', type="text/javascript").get('src').split('/')
# if flag:
if wb_data.status_code == 404:
pass
else:
soup = BeautifulSoup(wb_data.text, 'lxml')
data = {
'title':soup.title.text.strip(),
'price':soup.select('div.price_li > span > i')[0].text.strip(),
'time':soup.select('.pubtime')[0].text.strip().split('/')[0],
'area':list(map(lambda x:x.text,soup.select('ul.area-infor > li > a'))),
'cates':list(soup.select('div.cates > span > i')[0].stripped_strings),
'url':url
}
detail.insert_one(data) source_list = '''
http://test.com/books/
http://test.com/pictures/
''' # 读取数据
# $lt/$lte/$gt/$gte/$ne,依次等价于</<=/>/>=/!=。(l表示less g表示greater e表示equal n表示not )
for item in detail.find({'price': {'$lt': 100}}):
print(item) for i in detail.find():
if i['price'] >= 500:
print(i) if __name__ == '__main__':
# 使用多进程
pool = Pool()
# pool = Pool(processes=2)
if source_list is not None:
pool.map(get_links_from,source_list.split()) pool.close()
pool.join()

一般使用谷歌浏览器对要爬取的元素进行检查,在这一方面,好用一些,右键,选择Copy selector,获取到例如:div.cates > span > i,作为select函数的参数即可。

也可以自己写,在浏览器的检查元素页面上,ctrl + F 出现查找框,写入要使用的样式选择器,看看是否准确即可 。

例子:div.price_li > span 标识逐层级关系,div.price_li span 只是简单的包含关系

 5、参考文档

http://beautifulsoup.readthedocs.io/zh_CN/latest/

http://www.python-requests.org/en/master/

使用beautifulsoup与requests爬取数据的更多相关文章

  1. python requests 爬取数据

    import requests from lxml import etree import time import pymysql import json headers={ 'User-Agent' ...

  2. 使用BeautifulSoup和正则表达式爬取时光网不同地区top100电影并使用Matplotlib对比

    还有一年多就要毕业了,不准备考研的我要着手准备找实习及工作了,所以一直没有更新. 因为Python是自学不久,发现很久不用的话以前学过的很多方法就忘了,今天打算使用简单的BeautifulSoup和一 ...

  3. 关于js渲染网页时爬取数据的思路和全过程(附源码)

    于js渲染网页时爬取数据的思路 首先可以先去用requests库访问url来测试一下能不能拿到数据,如果能拿到那么就是一个普通的网页,如果出现403类的错误代码可以在requests.get()方法里 ...

  4. 【个人】爬虫实践,利用xpath方式爬取数据之爬取虾米音乐排行榜

    实验网站:虾米音乐排行榜 网站地址:http://www.xiami.com/chart  难度系数:★☆☆☆☆ 依赖库:request.lxml的etree (安装lxml:pip install ...

  5. python模拟浏览器爬取数据

    爬虫新手大坑:爬取数据的时候一定要设置header伪装成浏览器!!!! 在爬取某财经网站数据时由于没有设置Header信息,直接被封掉了ip 后来设置了Accept.Connection.User-A ...

  6. 如何分页爬取数据--beautisoup

    '''本次爬取讲历史网站'''#!usr/bin/env python#-*- coding:utf-8 _*-"""@author:Hurrican@file: 分页爬 ...

  7. 使用requests爬取梨视频、bilibili视频、汽车之家,bs4遍历文档树、搜索文档树,css选择器

    今日内容概要 使用requests爬取梨视频 requests+bs4爬取汽车之家 bs4遍历文档树 bs4搜索文档树 css选择器 内容详细 1.使用requests爬取梨视频 # 模拟发送http ...

  8. requests爬取百度音乐

    使用requests爬取百度音乐,我想把当前热门歌手的音乐信息爬下来. 首先进行url分析,可以看到: 歌手网页: 薛之谦网页: 可以看到,似乎这些路劲的获取一切都很顺利,然后可以写代码: # -*- ...

  9. scrapy爬取数据的基本流程及url地址拼接

    说明:初学者,整理后方便能及时完善,冗余之处请多提建议,感谢!   了解内容: Scrapy :抓取数据的爬虫框架     异步与非阻塞的区别   异步:指的是整个过程,中间如果是非阻塞的,那就是异步 ...

随机推荐

  1. 如何用 MEF 扩展应用程序

    最近在写一篇关于如何扩展 Visual Studio 编辑器的文章时,用到了 MEF,因此打算写一篇文章提一下这个技术点.本篇文章并不打算详细介绍 MEF,只是一个最简单的入门,相信您在阅读本篇文章后 ...

  2. MailKit---获取邮件

    MailKit是一个免费开源的邮箱类库,简单来说MailKit帮我们封装了有关邮箱的一些帮助类,提供方法让我们更容易使用邮箱的Smtp,Imap等邮箱协议. 现在的邮箱基本上都使用smtp协议从邮件服 ...

  3. 如何隐藏DIV对象

    DIV对象在网页里面,相当于一个容器,在其内部,可以显示文字.图片.视频控件等等. 以下的教程,和大家一起来学习,如何隐藏DIV对象. 这必须使用CSS来控制,才能达到隐藏的目的,那么,就得使用CSS ...

  4. sql无限递归查询

    --------------所有子集数据包括自己--------------------- CREATE PROCEDURE ALLSON @ID INT AS BEGIN WITH CTE AS ( ...

  5. 多线程同步工具——LockSupport

    用例1:子线程等待主线程发放许可! public static void main(String[] args) { Thread thread = new Thread(){ public void ...

  6. 网站文件系统发展&&分布式文件系统fastDFS

    网站文件系统发展 1.单机时代的图片服务器架构 初创时期由于时间紧迫,开发人员水平也很有限等原因.所以通常就直接在website文件所在的目录下,建立1个upload子目录,用于保存用户上传的图片文件 ...

  7. 【NLP】揭秘马尔可夫模型神秘面纱系列文章(五)

    向前向后算法解决隐马尔可夫模型机器学习问题 作者:白宁超 2016年7月12日14:28:10 摘要:最早接触马尔可夫模型的定义源于吴军先生<数学之美>一书,起初觉得深奥难懂且无什么用场. ...

  8. SQL Tuning 基础概述01 - Autotrace的设定

    1.autotrace的设定 SQL> set autotrace Usage: SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [ST ...

  9. Objective-C内存管理之引用计数

    初学者在学习Objective-c的时候,很容易在内存管理这一部分陷入混乱状态,很大一部分原因是没有弄清楚引用计数的原理,搞不明白对象的引用数量,这样就当然无法彻底释放对象的内存了,苹果官方文档在内存 ...

  10. Redis简单案例(四) Session的管理

    负载均衡,这应该是一个永恒的话题,也是一个十分重要的话题.毕竟当网站成长到一定程度,访问量自然也是会跟着增长,这个时候, 一般都会对其进行负载均衡等相应的调整.现如今最常见的应该就是使用Nginx来进 ...