V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  practicer  ›  全部回复第 7 页 / 共 8 页
回复总数  149
1  2  3  4  5  6  7  8  
2016-06-14 17:41:21 +08:00
回复了 hippoboy 创建的主题 Python 求推荐几个爬取 js 生成的动态网页的教程?PhantomJS?其他?
强烈推荐 《 Python 网络数据采集》,从第十章和十一章专门讲解如何爬取 JS 动态内容和图像识别,本书用一个爬取 flash 电子书的例子来说明,强烈推荐给题主。
2016-06-14 17:34:09 +08:00
回复了 whistle 创建的主题 问与答 google 搜索里这部分是怎么提供给 google 收录的?
以前为公司优化过 sitelink ,主要用到这几种策略, sitelink 是 google 算法自动排的,用户无法设置,所以叫策略。

1.完善或优化整站的 meta title 标签,降低重复标题。
2.优化导航栏模块,例如添加 html5 的<nav>元素,提高站点地图的优先级,让蜘蛛更好爬。
3.增加你希望显示在 sitelink 的页面的流量,比如如果网站有搜索功能,从搜索框引流到 sitelink 页面;竞价广告着陆页到这些页面; EDM 着陆页到 sitelink 页面。总之最重要的就是提升他们的流量和 CTR 。
2016-06-14 17:15:39 +08:00
回复了 69185499 创建的主题 程序员 有没有人用爬虫爬过 GooglePlay
https://github.com/MarcelloLins/GooglePlayAppsCrawler.py
以前给公司 app 做舆论监控时用过,现在不清楚是否还能用
2016-06-14 14:18:10 +08:00
回复了 practicer 创建的主题 Python python 多线程爬虫问题
@EchoUtopia 好难懂,我慢慢啃吧,谢谢分享。
2016-06-14 12:42:08 +08:00
回复了 practicer 创建的主题 Python python 多线程爬虫问题
@alexapollo
@YUX
@likuku
@geek123
@EchoUtopia
@Jblue

最后我放弃用多线程|多进程改这个爬虫了,还是没弄懂,打算多读一读各位列出的源码。

后面修改了一次爬虫,从逻辑上减少了一轮解析 HTML 的次数,也算是减少了爬取网页的时间:
1.fetchBooks(u'爬虫') 2.exportCsv(bookUrls)
解析页面分页的时候把 book 的详细页和翻页链接一次保存,上一个版本中为了得到他们 urlopen 了两次,比较浪费时间,另外用 global variable 来更新 book 详细页,翻页链接用递归来获取。

# -*- coding: UTF-8 -*-

import os
import re
import time
import json
import random
import urlparse
import unicodecsv as csv
from urllib2 import urlopen
from urllib2 import HTTPError
from bs4 import BeautifulSoup

import logging
logging.basicConfig(filename='douban.log', level=logging.DEBUG)

bookUrls = set()

def fetchBooks(start):
'''递归爬取翻页链接,同时获取该标签下所有书籍的 url'''
first = u'https://book.douban.com/tag/' + start
newPage = findPages(first)
while newPage:
newPage = findPages(newPage)
print 'Scraping books on page {!r} done'.format(newPage)
logging.info('Scraping books on page {!r} done'.format(newPage))
time.sleep(random.randint(1, 10))

def exportCsv(books):
'''写书籍详细信息到 csv 文件'''
data = (download(book) for book in books)
with open(os.path.join(os.path.dirname(__file__), 'books.csv'), 'wb') as f:
# with open('books.csv', 'wb') as f:
writer = csv.writer(f)
headers = (u'书名', u'原书名', u'出版日期', u'页数',
u'豆瓣评分', u'评价人数', u'ISBN', u'网址', u'TOP 评论')
writer.writerow(headers)
for line in data:
writer.writerow(line)
print 'Saving the book {} done'.format(line[6])
logging.info('Saving the book {} done'.format(line[6]))
time.sleep(random.randint(1, 10))
print 'Saving ALL done'
logging.info('Saving ALL done')

def findPages(pageUrl):
'''解析豆瓣图书分页 html ,获取翻页按钮链接,每页一个链接'''
html = urlopen(iriToUri(pageUrl))
bsObj = BeautifulSoup(html)
linkEle = bsObj.find('link', {'rel': 'next'})
if linkEle is not None:
if 'href' in linkEle.attrs:
findBooks(bsObj)
return u'https://book.douban.com' + linkEle.attrs['href']

def findBooks(bsObj):
'''解析豆瓣图书分页 html ,获取书籍详细页链接,每页 20 个链接'''
global bookUrls
books = bsObj.findAll('a', {'class': 'nbg'})
try:
if books is not None:
for book in books:
if 'href' in book.attrs and book.attrs['href'] not in bookUrls:
print 'Found new book: {}'.format(book.attrs['href'])
logging.info('Found new book: {}'.format(book.attrs['href']))
bookUrls.add(book.attrs['href'])
return bookUrls
except Exception as e:
print e.message
logging.exception('{}'.format(e))

def urlEncodeNonAscii(b):
"""将 non-ascii 转成 ascii 字符"""
return re.sub('[\x80-\xFF]', lambda c: '%%%02x' % ord(c.group(0)), b)

def iriToUri(iri):
"""打开带中文的网址,将 iri 转为 uri ,"""
parts = urlparse.urlparse(iri)
return urlparse.urlunparse(
part.encode('idna') if parti == 1 else urlEncodeNonAscii(part.encode('utf-8'))
for parti, part in enumerate(parts)
)

def getFullReview(reviewId):
'''抓包解析 review 内容'''
url = 'https://book.douban.com/j/review/' + str(reviewId) + '/fullinfo'
try:
html = json.loads(urlopen(url).read())['html']
except HTTPError as e :
print e.message
logging.error('Error: {}'.format(e))
return None
fullReview = re.search('.*(?=<div)', html).group()
if fullReview is not None:
return fullReview

def download(bookUrl):
'''解析书籍详细页'''
html = urlopen(bookUrl)
bsObj = BeautifulSoup(html)

try:
isbn = bsObj.find(id='info').find(
text=re.compile('(\d{10})|(\d{13})')).strip()
except AttributeError as e:
print e.message
logging.exception('{}'.format(e))
isbn = ''

try:
publishY = bsObj.find(id='info').find(
text=re.compile('\d{4}-\d{1,2}(-\d{1,2})?')).strip()
except AttributeError as e:
print e.message
logging.exception('{}'.format(e))
publishY = ''

try:
pageNum = bsObj.find(id='info').find(
text=re.compile('^\s\d{3,4}$')).strip()
except AttributeError as e:
print e.message
logging.exception('{}'.format(e))
pageNum = ''

try:
origName = bsObj.find(id='info').find(text=u'原作名:')
if origName is not None:
origName = bsObj.find(id='info').find(
text=u'原作名:').parent.next_sibling.strip()
except AttributeError as e:
print e.message
logging.exception('{}'.format(e))
origName = ''

try:
rating = bsObj.find(
'strong', {'class': 'll rating_num '}).get_text().strip()
except AttributeError as e:
print e.message
logging.exception('{}'.format(e))
rating = ''

try:
numRating = bsObj.find(
'span', {'property': 'v:votes'}).get_text()
except AttributeError as e:
print e.message
logging.exception('{}'.format(e))
numRating = ''

try:
reviewId = bsObj.find(
'div', {'id': re.compile(r'tb-(\d+)')}).attrs['id'][3:]
review = getFullReview(reviewId)
except AttributeError as e:
print e.message
logging.exception('{}'.format(e))
review = ''
title = bsObj.find('span', {'property': 'v:itemreviewed'}).get_text()
addr = bookUrl
return (title, origName, publishY, pageNum, rating,
numRating, isbn, addr, review)

if __name__ == '__main__':
print 'Starting at: {}'.format(time.ctime())
logging.info('Starting at: {}'.format(time.ctime()))
fetchBooks(u'股票')
exportCsv(bookUrls)
print 'All finished at: {}'.format(time.ctime())
logging.info('All finished at: {}'.format(time.ctime()))
2016-06-13 20:38:37 +08:00
回复了 omg21 创建的主题 Python 如何用正则或者 bs4 提取日期?
提主你没贴完整的结构,我们怎么帮得了你?我理解的是不是这样,
1.html 结构不同,日期可能出现在未知层级的元素里
2.日期格式不同
你最好都贴出来比较好
2016-06-13 18:57:07 +08:00
回复了 bwangel 创建的主题 Python Python 中数组是啥?
面试时回答一定要主动,把自己知道的如实答清楚即可,主动把相关的知识系统说出来。

例如我只知道列表和元组,就讲清楚这两者的区别。如果对数组有歧义,就说清楚 php 的数组和 python 的列表是一回事。如果熟悉 numpy ,把 ndarray 对象介绍一番也是加分的,不慌不忙把自己的知识说清楚即可,即使面试官有问题,也不要怀疑自己,心里骂一遍傻逼换一家继续面试。
2016-06-13 16:38:19 +08:00
回复了 practicer 创建的主题 Python python 多线程爬虫问题
@likuku 请教大大我的需求是哪种的?
2016-06-13 16:37:01 +08:00
回复了 practicer 创建的主题 Python python 多线程爬虫问题
@JhOOOn 还有爬知乎妹子头像、 1024 ,都是入门爬虫的标准目标啊,因为他们都拥有有价值的数据。
2016-06-13 16:35:19 +08:00
回复了 practicer 创建的主题 Python python 多线程爬虫问题
@YUX
@louk78
@geek123
@Jblue
@EchoUtopia

谢谢各位,我再改一下看看,边改边学好欢乐, HOHO
2016-06-13 13:52:23 +08:00
回复了 practicer 创建的主题 Python python 多线程爬虫问题
@Jblue 做你说的多线程和队列要用到哪些库和方法?能详细说一下吗?
2016-06-13 12:28:43 +08:00
回复了 jciba5n4y6u 创建的主题 程序员 leetcode 刷题心得
刷题属于长期回报,没事刷他一题非常有乐趣
2016-06-13 11:23:31 +08:00
回复了 practicer 创建的主题 Python python 多线程爬虫问题
@Allianzcortex 看起来不错喔,刚好在看 multiprocessing 和 queue 的手册,冥冥中感觉到是我想要的,感谢分享。
2016-06-13 11:19:34 +08:00
回复了 practicer 创建的主题 Python python 多线程爬虫问题
@araraloren
@YUX
@itlr
@ila
@wbt
@qianbaooffer

我的 1 、 2 、 3 个函数里面都设置了等待时间,也就是爬 page 链接的时候等一段时间,爬 book 链接的时候也等一段时间,爬 book 信息的时候还是会等一段时间,这样做是为了不给对方太大压力,虽然我知道我的小爬虫根本不会给他们带来任何负担,但这就是我的原则吧。我想改进的地方是,如何让这三个函数之间有(异步|多线程|多进程)处理的可能,从而改善爬虫的速度
2016-06-13 08:29:50 +08:00
回复了 practicer 创建的主题 Python python 多线程爬虫问题
@itlr
@YUX
很感谢两位的指教,能不能再帮我指点一下这种需求属于多线程还是多进程。
2016-06-06 09:09:09 +08:00
回复了 Pandara 创建的主题 程序员 大家平时闲暇时会做些什么呢?
陪老婆逛街
陪老婆看剧
陪老婆做家务
睡觉
看小电影
玩 DJ
leetcode 刷题
stackoverflow 答题
2016-06-06 09:02:04 +08:00
回复了 MyLeoWind 创建的主题 Python 逐行读取文本时哪种方法更好?
for line in f 语句将 file 对象转换成 iterable object ,既然是可迭代对象,一次只加载一个 item ,解释器不会将所有 items 放进内存,因此节省了资源。在 python 2.3 以前,要用 f.xreadlines()方法读大文件,它和 xrange 的作用一样,都是处理 iter(object),但在 2.3 后,官方明确用 for line in f 读取大文件。

for line in f.readlines() 语句和第一个类似,但是它先执行 f.readlines(),直接把 file 对象中所有的 line items 列表存进内存,在它们之上进行循环读取。

因此,读取大文件时用第一个语句,一般小文件这两个都可以。
2016-06-02 17:16:04 +08:00
回复了 ifconfig 创建的主题 Python 这种情况下应该用 Python 哪个框架?
@cc7756789 我也觉得直接存数据库, php 读库最实用。另外想知道为什么必须用 python 来做爬虫, PHP 不是一样可以爬嘛?换 python scrapy 不会有成本吗?
2016-05-19 08:44:18 +08:00
回复了 ruoyu0088 创建的主题 Python 开始编写《Python科学计算-第二版》
感谢译者的努力,上市后一定购买
我入门的数据计算读物是另外一本, python for data analysis
2016-03-23 08:34:57 +08:00
回复了 diggzhang 创建的主题 程序员 关于用户行为追踪,从收集到后端的疑问
@diggzhang 加我的微信 nickysher
1  2  3  4  5  6  7  8  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2778 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 28ms · UTC 08:10 · PVG 16:10 · LAX 00:10 · JFK 03:10
Developed with CodeLauncher
♥ Do have faith in what you're doing.