吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5482|回复: 27
收起左侧

[Python 转载] 几十行简易爬虫收集全球网址大全2.0(最终修改)全注释

   关闭 [复制链接]
allenmichael89 发表于 2021-5-31 17:30
昨天发了一次,也是同样的虫子,但是后来发现爬到某个页面的时候会出现编码错误,几经周折后,终于完成了,已经可以爬取想要的所有的数据了
然后,昨天发的帖子有不少和我一样都是初学者,为了让同学们更好的学习,我把相应的注释都打上了,嗯,对的所有注释 除了导入库包外,其它每行代码能注释的地方我都注释 希望对初学的同学有点帮助
如果还有免费的评分,如果您愿意的话,动动小手给我加个评分谢谢.

0000.png

这个虫子爬的所有数据最后都保存在db文件里,可以下载SQLite Expert Personal 免费的噢

sqlite版本

sqlite版本

这个是我爬完所有数据的用sqlit打开的样子

sqlite界面

sqlite界面

这个是我爬完的数据库文档

db文档

db文档

[Python] 纯文本查看 复制代码
#-*-coding:utf-8 -*-

import requests
import os
from lxml import etree
from fake_useragent import UserAgent
import sqlite3
def RquestTools(url): 
    headers = {
        'User-Agents': str(UserAgent().random)
    } #设置请示头部数据,防止被反爬虫面爬不到数据
    response = requests.get(url,headers=headers) #get一下url网址
    response.encoding = response.apparent_encoding  #最终的解码方式,全程解码错误,因为有方式1和2到同样一个页面都会编码错误,最后请教别人使用这个方法,已经成功爬完所有的数据
    response = response.text #提取get回来的text数据(text是Beautifulsoup根据猜测的编码方式将content内容编码成字符串。)
    #response = requests.tet(url,headers=headers).content.decode('bgk') #解码方式1,有错误,爬到一千多面的时候有一个页面会编码错误
    #response = response.encode('raw_unicode_escape').decode('gbk')#解码方式2,有错误,跟解码方式1一样,爬到同样位置会出错
    #response = response.encode('ISO-8859-1') #response = response.decode('gbk')  #解码方式3,有错误
    response = etree.HTML(response)
    return response
def str_finishing(seif): #sqlite3字符处理,因为有些符号影响sqlite命令行,所以需要处理
    str_temp = seif
    str = str_temp.replace("/","//")
    str = str.replace("\'","''")
    str = str.replace("[","/[")
    str = str.replace("]","/]")
    str = str.replace("%","/%")
    str = str.replace("_","/_")
    str = str.replace("(","/(")
    str = str.replace(")","/)")
    return str
url = 'http://www.world68.com/country.asp'# 设置请求网址
html = RquestTools(url) #获取第一层url的THML信息(为了提取国家名称及对应的url地址)
country = html.xpath('//div[@class="content_all r"]/dl/dd/a[1]/text()') # xpath定位国家名称
country_url = html.xpath('//div[@class="content_all r"]/dl/dd/a[1]/@href')# xpath定位国家url地址
conn = sqlite3.connect("E:\\worldurl.db") # 获取或创建数据库链接
litec = conn.cursor() # 获取游标

for i, c in zip(country, country_url):
    sqltable = 'create table ' + i + '(urltype,urlname,urladdress,urlintroduce)' #设置sqlite3的脚本语句,意思为 [创建-表格-表格名称(列)]
    litec.execute(str(sqltable))#执行sqlite3的脚本[sqltable = 创建-表格-国家-(网站分类-网站名称-网站地址-网站简介)],增加表格这些是不需要提交修改事务的,这里的修改会直接出现在db文件里
    corntry_html = RquestTools(c) #获取第二层url的HTML信息(为了提取网站类型及对应链接)
    cont_r_sort_c = corntry_html.xpath('//div[@class="content_r_sort_c"]/ul/li/a/text()') # xpath定位网站分类
    cont_r_sort_c_url = corntry_html.xpath('//div[@class="content_r_sort_c"]/ul/li/a/@href') # xpath定位网站分类url地址
    for v, m in zip(cont_r_sort_c, cont_r_sort_c_url):
        tryhtml = RquestTools(m) #获取第三层url的HTML信息(为了提取网站名称对应的Url地址,用此来提取第四层信息)
        urls = tryhtml.xpath('//dl[@class="top_page"]/dt/a/@href')
        for ii in urls:
            tryhtm2 = RquestTools(ii) #获取第四层url的HTML信息(为了提取网站名称\网站地址\网站简介)
            country_name = "".join(tryhtm2.xpath('//div[@class="name_r r"]/a/text()')) #网站名称
            country_name = str_finishing(country_name) #其中可能包含sqlite3的需要处理的符号,所以通过str_finishing处理一下
            country_url = "".join(tryhtm2.xpath('//div[@class="name_r r"]/a/@href')) #网站地址 #网站Url地址内没有需要处理的符号,所以直接就用了
            country_lits = "".join(tryhtm2.xpath('//div[@class="jianjie_r r"]/p/text()')) #网站简介
            country_lits = str_finishing(country_lits) #其中可能包含sqlite3的需要处理的符号,所以通过str_finishing处理一下
            sqladd = 'insert into ' + i + ' values (\'' + v + '\',\'' + country_name + '\',\'' + country_url + '\',\'' + country_lits + '\')'
            litec.execute(str(sqladd))#执行sqlite3的脚本,[新增-国家-(网站分类-网站名称-网站地址-网站简介)]
        conn.commit()# 提交修改事务,新增数据是需要提交修改的,所以在这里加这条,是为了增加了条一种不同的网站类别的数据后(也就是第四层HTML信息)提交一次
#关闭资料,sqlite3 打开了需要关闭,先关游标,再关文件,所有的python中open的文件都是需要关闭的,不然会出错
litec.close()#这里是关闭游标
conn.close()#这里是关闭数据库

免费评分

参与人数 10吾爱币 +8 热心值 +9 收起 理由
二狗O + 1 用心讨论,共获提升!
hshcompass + 1 + 1 谢谢@Thanks!
搬砖孩子要毕业 + 1 谢谢@Thanks!
安道尔的鱼 + 1 + 1 用心讨论,共获提升!
夜游星河 + 1 + 1 我很赞同!
ma4907758 + 1 谢谢@Thanks!
丶凹凸俊 + 1 + 1 热心回复!
fanvalen + 1 + 1 有改进
suiomog + 1 + 1 谢谢@Thanks!
ziwenpl + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

miracle1989 发表于 2021-6-24 16:53
本帖最后由 miracle1989 于 2021-6-24 16:56 编辑

Error occurred during loading data. Trying to use cache server https://fake-useragent.herokuapp.com/browsers/0.1.11
Traceback (most recent call last):
  File "C:\Users\liyh\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 1318, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
  File "C:\Users\liyh\AppData\Local\Programs\Python\Python36\lib\http\client.py", line 1239, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:\Users\liyh\AppData\Local\Programs\Python\Python36\lib\http\client.py", line 1285, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "C:\Users\liyh\AppData\Local\Programs\Python\Python36\lib\http\client.py", line 1234, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "C:\Users\liyh\AppData\Local\Programs\Python\Python36\lib\http\client.py", line 1026, in _send_output
    self.send(msg)
  File "C:\Users\liyh\AppData\Local\Programs\Python\Python36\lib\http\client.py", line 964, in send
    self.connect()
  File "C:\Users\liyh\AppData\Local\Programs\Python\Python36\lib\http\client.py", line 1392, in connect
    super().connect()
  File "C:\Users\liyh\AppData\Local\Programs\Python\Python36\lib\http\client.py", line 936, in connect
    (self.host,self.port), self.timeout, self.source_address)
  File "C:\Users\liyh\AppData\Local\Programs\Python\Python36\lib\socket.py", line 724, in create_connection
    raise err

请问这是为什么呢
 楼主| allenmichael89 发表于 2021-5-31 19:04
comos 发表于 2021-5-31 18:11
db能上传下不。小白们说。

db包是我爬下来的吖  ,你可以下载http://sqliteexpert.com/download.html           Freeware 版本就可以打开了
追风营销 发表于 2021-5-31 17:38
ziwenpl 发表于 2021-5-31 17:41
感谢分享
comos 发表于 2021-5-31 18:11
db能上传下不。小白们说。
fanvalen 发表于 2021-5-31 18:33
我只想问一下sql的读写速度怎么样
十分等待 发表于 2021-5-31 18:39

感谢楼主分享
w360 发表于 2021-5-31 18:50
感谢大佬分享
周留伟 发表于 2021-5-31 19:09
不错,先试试看
红蓝黄 发表于 2021-5-31 19:18
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-3 03:13

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表