正文
from
random
import
randint
import
time
def getHTMLText(url):
while
True
:
try
:
r = requests.get(url, timeout =
30
)
r.encoding = r.apparent_encoding
return
r.text
except
Exception
as
e:
print(e)
print(
"重新连接..."
)
time.sleep(randint(
1
,
3
))
这里加入了
try/except
,如果出现了如网页连接超时,网络中断等问题时,会输出不能成功抓取的原因,并随机休息
1-3
秒,而加入
while True
则保证了未成功抓取时会一直反复尝试,直到成功。
2.2抓取一个网页的信息
我们在源代码中查找相应的信息所在的位置,并用正则表达式匹配出来:
def gethtmlinfo(url):
html = getHTMLText(url)
data = {} data['title'] = re.findall(r'(.*?)
', str(html))[0]
data['laiyuan'] = re.findall(r'来源:(.*?)', html)[0]
data['zuozhe'] = re.findall(r'作者:(.*?)', html)[0]
data['fabu'] = re.findall(r'发布日期:(.*?)', html)[0]
data['liulan'] = re.findall(r'浏览数:(\d+)', html)[0]
data['neirong'] = re.sub(r'<.>|[\r\n\u3000]','',re.findall(r'(.*?)
',html,re.S)[
0])
data[
'tupian'] =
'http://www.cgw.gr' + re.findall(
r', html)[0]
return(data)值得注意的是,查看新闻内容的源代码,每一段内容都是分开给出的。

因此在抓取内容时,我们添加参数:re.S,它的作用使得“.”能匹配的范围扩展到整个字符串,包括“\n”,也就是说它可以跨行进行匹配。由于使用正则匹配出来的结果以列表显示,所以以[0]选出字符串,另外,re.sub(r'<.>|[\r\n\u3000]','',html)表示将制定字符串替换为空。另外,由于源代码中图片给出的链接不完整,因此将其补全。
最后输出结果为:

构建一个函数pymysql将数据传到xizhongwang这个表中。
def pymysql(data):
table = 'xizhongwang'
keys = ','.join(data.keys())
values = ', '.join(['%s'] * len(data))
cursor = db.cursor()
sql = 'replace INTO {table} ({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)
try:
if cursor.execute(sql, tuple(data.values())):
print('Successful')
db.commit()
except:
print('Failed')
db.rollback()
我们会在程序运行结果窗口看到“Successful”,然后再去MySQL中看看我们的数据是否传到xizhongwang表:

注:此推文中的图片及封面(除操作部分的)均来源于网络!如有雷同,纯属巧合!
以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!