python爬取图书信息_Python3 爬虫爬取中国图书网(淘书团) 记录

本人为一名刚开始学Python爬虫的小白,开贴仅为记录下自己的学习历程,方便做review

要爬取链接:http://tuan.bookschina.com/

要爬取内容: 图书名称, 图书价格, 以及对应预览图的link

本文用到py packages: requests, BeautifulSoup, json, cvs

打开中国图书网团购页面时,发现网站的信息是动态加载的:

Anyways,先不考虑加载更多页的图书信息,我们从尝试着抓取第一页的图书信息开始:

本次爬虫所用的浏览器为chrome

所以我们打开浏览器的开发者模式F12,可以看到页面加载的相应信息

为了实现模拟浏览器登录功能,我们需要查看header的信息:

完成对应的代码:

header = {

‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36‘,

‘Host‘: ‘tuan.bookschina.com‘,

‘Referer‘: ‘http://tuan.bookschina.com/‘,

‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8‘,

‘Accept-Encoding‘: ‘gzip, deflate‘,

‘Accept-Language‘: ‘zh-CN,zh;q=0.9‘

}

接下来我们需要做的就是分析整个中国图书网的DOM,去查看我们需要的信息,都封装在哪些tags里面

经过地毯式搜索。。。。我们发现我们所需要的信息,都封装在

  • 的子节点li里面

所以,我们打算采取BeautifulSoup的解析抓取功能,来实现拿到li内的我们需要的信息

对应的代码:

url = ‘http://tuan.bookschina.com/‘

response = requests.get(url, headers = header) #模仿浏览器登录

response.encoding = ‘utf-8‘

soup = BeautifulSoup(response.text,‘html.parser‘)

for item in soup.select(‘div .taoListInner ul li‘):

print(item.select(‘h2‘)[0].text) #返回对象为数组

print(item.select(‘.salePrice‘)[0].text)

print(item.select(‘img‘)[0].get(‘src‘)) #get方法用来取得tab内部的属性值

首先我们需要调用requests的get方法,拿到响应的response,然后通过BS进行解析,我们会发现,在class 名为 taoListInner的div标签中,封装了我们想要的ul下的li

查看了beautifulsoup的文档,对比了find_all 和select,决定调用select方法拿到对应的标签,然后拿到对应h2标签下的书名; salePrice class下的价格; 以及img标签

内src的预览图link。这样就可以打印出我们想要的第一页所显示的书籍的信息了。

但是问题就出来了。。。如果我们想拿后续页面的更多书籍信息,该怎么办呢,因为bs的select方法是只能解析静态的Dom的

所以我们怀疑,后续的图书数据是通过Ajax 或者 JS 加载的

我们来到开发者模式的XHR下面,我们会发现,每当我们下拉滚动条,刷新图书信息的时候,会跟随者刷新出一个GroupList?.....的链接

我们打开他

惊喜的发现在previews里,封装了我们需要的数据,并且是以Json形式予以保存的

所以我们要拿到这个Json数据,需要去拿他的Request URL

当前的URL为:http://tuan.bookschina.com/Home/GroupList?Type=0&Category=0&Price=0&Order=11&Page=2&Tyjson=true

我们会发现一个规律,每当有新的书籍信息刷新一次的时候,URL中的Page=?也会跟随递增

所以问题迎刃而解了。。。。我们只需要去通过URL拿到返回的JSON进行解析,便可以拿到我们想要的全部数据了

也验证了一个说法,许多动态加载的网站,都会把Json数据封装作为response,这样就给我们的爬虫找到一条捷径

url = ‘http://tuan.bookschina.com/Home/GroupList?Type=0&Category=0&Price=0&Order=11&Page=2&Tyjson=true‘

response = requests.get(url)

result = json.loads(response.text)

bookinfo = {}

for data in result[‘Data‘]:

bookinfo[‘bookName‘] = data[‘book_name‘]

bookinfo[‘price‘] = data[‘group_price‘]

bookinfo[‘iconLink‘] = data[‘group_image‘]

print(url)

这里用里调用了loads()方法,把返回的json数据转换为python的字典,方便拿数据

拿到数据后我们决定把数据存入磁盘,生成cvs的excel文件,方便做进一步的数据分析

所以,本次爬虫小实验全部代码如下:

import requests

from bs4 import BeautifulSoup

import json

import csv

def parse_one_page():

header = {

‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36‘,

‘Host‘: ‘tuan.bookschina.com‘,

‘Referer‘: ‘http://tuan.bookschina.com/‘,

‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8‘,

‘Accept-Encoding‘: ‘gzip, deflate‘,

‘Accept-Language‘: ‘zh-CN,zh;q=0.9‘

}

url = ‘http://tuan.bookschina.com/‘

response = requests.get(url, headers = header) #模仿浏览器登录

response.encoding = ‘utf-8‘

soup = BeautifulSoup(response.text,‘html.parser‘)

for item in soup.select(‘div .taoListInner ul li‘):

print(item.select(‘h2‘)[0].text) #返回对象为数组

print(item.select(‘.salePrice‘)[0].text)

print(item.select(‘img‘)[0].get(‘src‘)) #get方法用来取得tab内部的属性值

def dynamtic_claw_data(page, headers, fileName):

for i in range(page):

url = ‘http://tuan.bookschina.com/Home/GroupList?Type=0&Category=0&Price=0&Order=11&Page=‘ + str(

i) + ‘&Tyjson=true‘

response = requests.get(url)

result = json.loads(response.text)

bookinfo = {}

for data in result[‘Data‘]:

bookinfo[‘bookName‘] = data[‘book_name‘]

bookinfo[‘price‘] = data[‘group_price‘]

bookinfo[‘iconLink‘] = data[‘group_image‘]

write_csv_rows(fileName,headers,bookinfo)

print(url)

def write_csv_headers(path, headers):

with open(path, ‘a‘, encoding=‘gb18030‘, newline=‘‘) as f:

f_csv = csv.DictWriter(f, headers)

f_csv.writeheader()

def write_csv_rows(path, headers, rows):

with open(path, ‘a‘, encoding=‘gb18030‘, newline=‘‘) as f:

f_csv = csv.DictWriter(f, headers)

# 如果写入数据为字典,则写入一行,否则写入多行

if type(rows) == type({}):

f_csv.writerow(rows)

else:

f_csv.writerows(rows)

def main(page):

# parse_one_page() #Tip: beautifulSoup test

csv_filename = "bookInfo.csv"

headers = [‘bookName‘, ‘price‘, ‘iconLink‘]

write_csv_headers(csv_filename,headers)

dynamtic_claw_data(page, headers, csv_filename)

if __name__ == ‘__main__‘:

main(20) #input page num to start

原文:https://www.cnblogs.com/ChrisInsistPy/p/8981820.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

求1到100中9的个数

个位9的数目十位9的数目 #include<stdio.h> int main() {int num 0;int count 0;for (num 1; num < 100; num){if (num % 10 9) //个位9的个数count;if (num / 10 9)//十位9的个数count;}printf("%d", count);return 0; }

Android 核心已经从 Linux kernel 代码库中删除

Greg Kroah-Hartman Novell 的开发人员&#xff0c;他主要负责维护 Linux 操作系统的启动&#xff0c;USB和驱动核心&#xff0c;近日他表示谷歌 Android 系统的驱动核心 已经从 Linux kernel 2.6.33 代码库中删除。Greg Kroah-Hartman 也是一个 Android 手机系统的爱好者&…

福克斯保养明细

福克斯轮胎厚度&#xff1a; 胎冠厚度在13mm左右(胎冠花纹深7mm、胎冠厚6mm&#xff09;&#xff0c; 胎侧厚度5mm。 现在的轿车轮胎一般胎面胶层厚度都比较厚&#xff0c;以165/70R13 锦湖KR19轮胎为例:花纹深度为7毫米&#xff0c;缓冲层1&#xff0d;1.5毫米&#xff0c;冠带…

python中英文半角还是全角_Python3全角转半角的方法

相信大家都对全角半角的概念已经有所了解了。中文文字永远是全角&#xff0c;只有英文字母、数字键、符号键才有全角半角的概念,一个字母或数字占一个汉字的位置叫全角&#xff0c;占半个汉字的位置叫半角。标点符号在中英文状态下、全半角的状态下是不同的。转换说明全角半角转…

USACO 1.1 Your Ride Is Here

今天开始切USACO 加油 /* ID: aznfy1 PROG: ride LANG: C */ #include <iostream> #include <fstream> #include <string> #include <stdio.h>using namespace std;char a[10],b[10];int main() {freopen("ride.in","r",stdin);f…

C语言分数求和

eg.1-1/21/3-1/41/5-1/6…1/99-1/100 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h>int main() {int i 0;double sum 0.0;int flag 1;for (i 1; i < 100; i){sum flag*1.0 / i;flag -flag;}printf("%lf\n", sum);return 0; }

Mysql支持的数据类型(总结)

2019独角兽企业重金招聘Python工程师标准>>> 一.数值类型 Mysql支持所有标准SQL中的数值类型&#xff0c;其中包括严格数据类型(INTEGER,SMALLINT,DECIMAL,NUMBERIC)&#xff0c;以及近似数值数据类型(FLOAT,REAL,DOUBLE PRESISION),并在此基础上进行扩展。 扩展后增…

chrome web store的信息

chrome web store终于现身了&#xff0c;期待好久了啊&#xff01;以后好玩了&#xff0c;哈哈。迅速记录一下几个链接&#xff1a;https://chrome.google.com/webstorehttp://groups.google.com/a/chromium.org/group/chromium-apps/topicshttp://code.google.com/intl/zh-CN/…

uniapp 获取到js文件var一个变量怎么获取到这个变量值_浅析Js中const,let,var的区别及作用域...

理解&#xff1a;let变量的作用域只能在当前函数中js中const,let,var的区别及作用域_lianzhang861的博客-CSDN博客​blog.csdn.net全局作用域中&#xff0c;用 const 和 let 声明的变量不在 window 上&#xff0c;那到底在哪里&#xff1f;如何去获取&#xff1f;​blog.csdn.n…

C语言求十个数中最大值

一.代码 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {int arr[] { 1,2,3,4,5,63,7,8,9,11 };int sz sizeof(arr) / sizeof(arr[0]);int max arr[0];int i 0;for (i 1; i < 10; i){if (arr[i] > max)max arr[i];}printf("%d\n&qu…

ubuntu20.04安装timeshift最新方法

总结&#xff1a; 现在可以使用如下代码安装 sudo apt-get update sudo apt-get install timeshift原因&#xff1a; 在尝试Timeshift系统备份与还原中的方法时&#xff0c; sudo apt-add-repository -y ppa:teejee2008/ppa运行失败。 更改为以下代码&#xff1a; sudo a…

js基础练习---面向对象浅理解分析

function createPerson(name,sex,color) //构造函数{var objnew Object();//创建一个空对象obj.namename; obj.sexsex;obj.colorcolor;obj.Shownamefunction(){alert("我的名字是"this.name);};obj.Showsexfunction(){alert("我是"this.sex"的")…

前端一些面试问题3

DOM结构——两个节点之间可能存在哪些关系以及如何在节点之间任意移动。 DOM操作——怎样添加、移除、移动、复制、创建和查找节点。 1.创建新节点 createDocumentFragment() createElement() createTextNode() 2.添加、移除、替换 appendChild() removeChild() replaceChild(…

SQL Server安全(6/11):执行上下文与代码签名(Execution Context and Code Signing)

在保密你的服务器和数据&#xff0c;防备当前复杂的攻击&#xff0c;SQL Server有你需要的一切。但在你能有效使用这些安全功能前&#xff0c;你需要理解你面对的威胁和一些基本的安全概念。这篇文章提供了基础&#xff0c;因此你可以对SQL Server里的安全功能充分利用&#xf…

索引超出数组界限是什么意思_从V8源码分析一个JS 数组的内存占用问题

前段时间&#xff0c;在排查一个问题的时候&#xff0c;遇到了一个有点令人困惑的情况&#xff0c;有下面这两段代码&#xff1a;const a new Array(99999); a[99998] undefined;const b new Array(99999); b[99999] undefined;我们通过 node --inspect-brk 来分别运行这两…

浅谈PVID和VID区别

PVID和VID彻底研究&#xff08;上&#xff09;——PVID的作用及和VID的区别Pvid和Vid经常出现于二、三层交换机里&#xff0c;由于PVID和VID的设置不合理&#xff0c;造成VLAN划分变得混乱。本文就对PVID和VID进行了彻底研究。pvid是交换机上的概念,说的是进入该端口的报文如果…

C语言打印九九乘法口诀

一.代码 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {int i 0;int j 0;for (i 1; i < 10; i){for (j 1; j < i; j){printf("%d*%d%-2d", i, j, i * j);}printf("\n");}return 0; }二.运行结果

设计模式系列之十二:单例模式

前言 1.描述 Singleton(单例)是设计模式的一种,为了保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 2.主要特点 1)单例类确保自己只有一个实例(构造函数私有:不被外部实例化,也不被继承)。 2)单例类必须自己创建自己的实例。 3)单例类必须为其他对象提供唯…

python double free_python错误:double free或corruption(out):0x0000000001e4b030

dataset" rel"nofollow noreferrer">Code &sourceubuntu 16.04GNU收音机3.7.12UHD 3.10.1.1数字1.13.1压缩比0.19.1当我用Gnuradio生成一个数据集时&#xff0c;我遇到了这个问题&#xff0c;这些代码在我换另一台计算机之前一直运行良好&#xff0c;我搜…

myeclipse 8.5最新注册码(过期时间到2016年)

转自&#xff1a;http://hi.baidu.com/bagewell/item/c68cd0c4251d661f515058d4 Subscriber:huazai Subscription Code:uLR8ZC-855550-61565856301609203 Subscriber:feifei Subscription Code:sLR8ZC-855550-61565856701742177 Subscriber:kobe …