2024年最全Python爬虫实战(一):翻页爬取数据存入SqlServer

html = etree.HTML(html_str)

div_list = html.xpath(“//div[@class=‘pagination’]”) # 根据div分组

try:

for div in div_list:

a = div.xpath(“//a[@class=‘number’]/text()”)

index = len(a)-1

page = int(a[index])

except:

page = 1

print(page,‘页’)

return page

获取每页中n个详情页地址

def get_content_list(self,html_str):

html = etree.HTML(html_str)

div_list = html.xpath(“//div[@class=‘item_wrapper’]”) # 根据div分组

item = {}

for div in div_list:

item[“href”]= div.xpath(“//a[@class=‘img-container’]/@href”)

获取每页中详情页个数

html1 = etree.HTML(html_str)

div_list1 = html1.xpath(“//div[@class=‘item_wrapper’]”) # 根据div分组

detailed_num = len(div_list1)

print(detailed_num)

拼接网页

for i in range(0,detailed_num):

item[“href”][i] = ‘http://www.mp.cc%s’ % item[“href”][i]

for value in item.values():

content_list = value

#print(content_list)

return content_list

获取1-n(n最大为39)个详情页信息

def get_information(self,content_list):

information = []

for i in range(len(content_list)):

details_url = content_list[i]

html_str = self.parse_url(details_url)

html = etree.HTML(html_str)

div_list = html.xpath(“//div[@class=‘d_top’]”) # 根据div分组

item = []

for div in div_list:

title = div.xpath(“///div[@class=‘d_top_rt_right’]/text()”)

price = div.xpath(“//div[@class=‘text price2box’]/span[2]/text()”)

number = div.xpath(“//div[@class=‘text’][1]/text()”)

category = div.xpath(“//div[@class=‘text’][2]/span[@class=‘cate’]/text()”)

term = div.xpath(“//div[@class=‘text’][3]/text()”)

groups = div.xpath(“//div[@class=‘text’][4]/text()”)

Range = div.xpath(“//div[@class=‘text’][5]/text()”)

img_url = div.xpath(“//img[@class=‘img_logo’]/@src”)

title = ’ ‘.join(title).replace(’\n’, ‘’).replace(‘\r’, ‘’).replace(’ ‘,’')

price = ’ '.join(price)

number = ’ ‘.join(number).replace(’\n’, ‘’).replace(‘\r’, ‘’).replace(’ ‘,’')

category = ’ '.join(category)

term = ’ ‘.join(term).replace(’\n’, ‘’).replace(‘\r’, ‘’).replace(’ ‘,’')

groups = ’ ‘.join(groups).replace(’\n’, ‘’).replace(‘\r’, ‘’).replace(’ ‘,’')

Range = ’ ‘.join(Range).replace(’\n’, ‘’).replace(‘\r’, ‘’).replace(’ ‘,’')

img_url = ’ '.join(img_url)

item.append(title)

item.append(price)

item.append(number)

item.append(category)

item.append(term)

item.append(groups)

item.append(Range)

item.append(img_url)

item = tuple(item)

information.append(item)

#print(information)

return information

def insert_sqlserver(self, information):

连接本地数据库服务,创建游标对象

db = pymssql.connect(‘.’, ‘sa’, ‘yuan427’, ‘test’) #服务器名,账户,密码,数据库名

if db:

print(“连接成功!”)

cursor= db.cursor()

try:

插入sql语句

sql = “insert into MPSB (title,price,number,category,term,groups,Range,img_url) values (%s,%s,%s,%s,%s,%s,%s,%s)”

执行插入操作

cursor.executemany(sql,information)

db.commit()

print(‘成功载入…’ )

except Exception as e:

db.rollback()

print(str(e))

关闭游标,断开数据库

cursor.close()

db.close()

实现主要逻辑

def run(self):

for type_num in range(1,46):

1.拼接网页获取每个类别的页数page

url = self.baseurl % (1,type_num)

html_str = self.parse_url(url)

page = self.get_page_num(html_str) + 1

for i in range(1,page):

url = self.baseurl % (i,type_num)

x = 0

while x<1:

2.发送请求,获取相应

html_str = self.parse_url(url)

3.获取第一页中39个详情页地址

content_list= self.get_content_list(html_str)

4.获取39个详情页信息

information = self.get_information(content_list)

5.入库

self.insert_sqlserver(information)

x += 1

if name == “main”:

trademarkSpider = TrademarkSpider()

trademarkSpider.run()

在这里插入图片描述

先讲讲我的整体思路再逐步解释

  • 第一步:构造主页的URL地址

  • 第二步:发送请求,获取响应

  • 第三步:获取第一页中39个详情页地址

  • 第四步:获取39个详情页信息

  • 第五步:存入SqlServer数据库

  • 第六步:实现主页翻页(1-91页)

第一步


我们先手动翻页,1-3页:

http://www.mp.cc/search/1?category=25

http://www.mp.cc/search/2?category=25

http://www.mp.cc/search/3?category=25

可以看出来,网址只有中间一个数据在逐步递增,所以就可以构造主页地址,代码如下:

for i in range(1,92):

1.构造主页地址

url = self.baseurl % i

这里做了字符串拼接,baseurl在 __init__(self)中:

self.baseurl = “http://www.mp.cc/search/%s?category=25” #通过%s传数字进入

第二步


发送请求,获取响应,代码如下:

def init(self) :

self.baseurl = “http://www.mp.cc/search/%s?category=25”

self.headers = {“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36”}

发送请求,获取相应

def parse_url(self,url):

response = requests.get(url,headers=self.headers)

return response.content.decode() #返回网页代码,我们就在这里面提取数据

这会就有小伙伴不明白了,你headers什么意思啊?

  • 防止服务器把我们认出来是爬虫,所以模拟浏览器头部信息,向服务器发送消息

  • 这个 “装” 肯定必须是要装的!!!

在这里插入图片描述

第三步


获取第一页中39个详情页地址,代码如下:

def get_content_list(self,html_str):

html = etree.HTML(html_str)

div_list = html.xpath(“//div[@class=‘item_wrapper’]”) # 根据div分组

item = {}

获取网页(只有半截,如:/brand/detail/36003501)

for div in div_list:

item[“href”]= div.xpath(“//a[@class=‘img-container’]/@href”)

拼接网页

for i in range(39):

item[“href”][i] = ‘http://www.mp.cc%s’ % item[“href”][i]

#遍历字典存入列表

for value in item.values():

content_list = value

print(content_list)

return content_list

1)我们先把获取到的主页代码转换为Elements对象,就和网页中的一样,如下图html = etree.HTML(html_str)

在这里插入图片描述

2)写Xpath根据div分组div_list = html.xpath("//div[@class='item_wrapper']")

如图可以看出每个商标的详情地址都在<div class="item_wrapper">

在这里插入图片描述

3)提取地址

item = {}

for div in div_list:

item[“href”]= div.xpath(“//a[@class=‘img-container’]/@href”)

拼接网页

for i in range(39):

item[“href”][i] = ‘http://www.mp.cc%s’ % item[“href”][i]

#遍历字典存入列表

for value in item.values():

content_list = value

4)效果如下

[‘http://www.mp.cc/brand/detail/36449901’, ‘http://www.mp.cc/brand/detail/26298802’, ‘http://www.mp.cc/brand/detail/22048146’, ‘http://www.mp.cc/brand/detail/4159836’, ‘http://www.mp.cc/brand/detail/9603914’, ‘http://www.mp.cc/brand/detail/4156243’, ‘http://www.mp.cc/brand/detail/36575014’, ‘http://www.mp.cc/brand/detail/39965756’, ‘http://www.mp.cc/brand/detail/36594259’, ‘http://www.mp.cc/brand/detail/37941094’, ‘http://www.mp.cc/brand/detail/38162960’, ‘http://www.mp.cc/brand/detail/38500643’, ‘http://www.mp.cc/brand/detail/38025192’, ‘http://www.mp.cc/brand/detail/37755982’, ‘http://www.mp.cc/brand/detail/37153272’, ‘http://www.mp.cc/brand/detail/35335841’, ‘http://www.mp.cc/brand/detail/36003501’, ‘http://www.mp.cc/brand/detail/27794101’, ‘http://www.mp.cc/brand/detail/26400645’, ‘http://www.mp.cc/brand/detail/25687631’, ‘http://www.mp.cc/brand/detail/25592319’,

‘http://www.mp.cc/brand/detail/25593974’, ‘http://www.mp.cc/brand/detail/24397124’, ‘http://www.mp.cc/brand/detail/23793395’, ‘http://www.mp.cc/brand/detail/38517219’, ‘http://www.mp.cc/brand/detail/36921312’, ‘http://www.mp.cc/brand/detail/6545326_6545324’, ‘http://www.mp.cc/brand/detail/8281719’, ‘http://www.mp.cc/brand/detail/4040639’, ‘http://www.mp.cc/brand/detail/42819737’, ‘http://www.mp.cc/brand/detail/40922772’, ‘http://www.mp.cc/brand/detail/41085317’, ‘http://www.mp.cc/brand/detail/40122971’, ‘http://www.mp.cc/brand/detail/39200273’, ‘http://www.mp.cc/brand/detail/38870472’, ‘http://www.mp.cc/brand/detail/38037836’, ‘http://www.mp.cc/brand/detail/37387087’, ‘http://www.mp.cc/brand/detail/36656221’, ‘http://www.mp.cc/brand/detail/25858042’]

因为我们获取的详情页地址只有半截,所以在做一个拼接!

可能这里有小伙伴要问了为什么你要先存入字典再存列表呢???

可以自己试试如果直接存列表,所有的地址全部都挤在一起了,没法拼接!!!

在这里插入图片描述

第四步


分别进行39个详情页,并获取信息,代码如下:

获取39个详情页信息

def get_information(self,content_list):

information = []

for i in range(len(content_list)):

details_url = content_list[i]

html_str = self.parse_url(details_url)

html = etree.HTML(html_str)

div_list = html.xpath(“//div[@class=‘d_top’]”) # 根据div分组

item = []

for div in div_list:

title = div.xpath(“///div[@class=‘d_top_rt_right’]/text()”)

price = div.xpath(“//div[@class=‘text price2box’]/span[2]/text()”)

number = div.xpath(“//div[@class=‘text’][1]/text()”)

category = div.xpath(“//div[@class=‘text’][2]/span[@class=‘cate’]/text()”)

term = div.xpath(“//div[@class=‘text’][3]/text()”)

groups = div.xpath(“//div[@class=‘text’][4]/text()”)

Range = div.xpath(“//div[@class=‘text’][5]/text()”)

img = div.xpath(“//img[@class=‘img_logo’]/@src”)

title = ’ ‘.join(title).replace(’\n’, ‘’).replace(‘\r’, ‘’).replace(’ ‘,’')

price = ’ '.join(price)

number = ’ ‘.join(number).replace(’\n’, ‘’).replace(‘\r’, ‘’).replace(’ ‘,’')

category = ’ '.join(category)

term = ’ ‘.join(term).replace(’\n’, ‘’).replace(‘\r’, ‘’).replace(’ ‘,’')

groups = ’ ‘.join(groups).replace(’\n’, ‘’).replace(‘\r’, ‘’).replace(’ ‘,’')

Range = ’ ‘.join(Range).replace(’\n’, ‘’).replace(‘\r’, ‘’).replace(’ ‘,’')

img = ’ '.join(img)

item.append(title)

item.append(price)

item.append(number)

item.append(category)

item.append(term)

item.append(groups)

item.append(Range)

item.append(img)

item = tuple(item)

information.append(item)

#print(information)

return information

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值